Cân nhắc
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Nếu a và b là UNIQUE
trường, UPDATE
xảy ra trên a = 1 OR b = 2
. Ngoài ra khi điều kiện a = 1 OR b = 2
được đáp ứng bởi hai mục nhập trở lên, cập nhật chỉ được thực hiện một lần.
Ví dụ ở đây bảng bảng với Id và Tên UNIQUE
lĩnh vực
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Nếu truy vấn là
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
sau đó chúng tôi nhận được
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
vi phạm tính duy nhất của Id và Name. Bây giờ với
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
chúng tôi nhận được
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Hành vi trên nhiều khóa là như sau
UPDATE
trong ON DUPLICATE KEY UPDATE
được thực hiện nếu một trong các UNIQUE
trường bằng giá trị được chèn. Đây, UPDATE
được thực hiện trên Id = 1 OR Name = C
. Nó tương đương với
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Điều gì xảy ra nếu tôi chỉ muốn một bản cập nhật cho một trong hai khóa
Có thể sử dụng UPDATE
câu lệnh với LIMIT
từ khóa
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
cái nào sẽ cho
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Điều gì xảy ra nếu tôi chỉ muốn một bản cập nhật nếu các giá trị cho cả hai khóa đều khớp
Một giải pháp là ALTER TABLE
và tạo PRIMARY KEY
(hoặc tính duy nhất) hoạt động trên cả hai trường.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Bây giờ, trên
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
chúng tôi nhận được
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
vì không tìm thấy bản sao (trên cả hai khóa).