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
lĩnh vực, 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 hoặc nhiều mục, cập nhật chỉ được thực hiện một lần.
Ex đâ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
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
vi phạm tính độc đáo của Id và Tên. 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
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Hành vi trên nhiều phím như sau
UPDATE
trong ON DUPLICATE KEY UPDATE
được thực hiện nếu một trong các lĩnh vực UNIQUE
bằng giá trị được chèn vào. Ở đâ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
gì nếu tôi muốn một bản cập nhật mà thôi, cho một trong các phím
có thể sử dụng UPDATE
tuyên bố với LIMIT
từ khóa
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
mà sẽ cung cấp 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 cập nhật một lần nếu các giá trị cho cả hai khóa được khớp với nhau
Một giải pháp là ALTER TABLE
và làm cho PRIMARY KEY
(hoặc tính độc đáo) 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
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
vì không trùng lặp (trên cả hai phím) được tìm thấy.
Nếu bạn có một bảng với hai cột như khóa chính, và muốn làm việc với ON DUPLICATE KEY, phải tránh thêm chỉ số duy nhất cho các cột pk, vì điều này sẽ cập nhật nếu pk1 hoặc pk2 có mặt trong các giá trị. – jloria
Có cách nào để có một ràng buộc duy nhất trên cột thứ 2, nhưng có nó để nó không ảnh hưởng đến hoạt động cập nhật khóa trùng lặp này không? Điều này có nghĩa là chèn hoặc cập nhật không thành công nếu hạn chế duy nhất không được đáp ứng. – CMCDragonkai