Tôi đã sử dụng ON DUPLICATE KEY UPDATE
rất nhiều. Đối với một số trường hợp, tiện ích mở rộng SQL không chuẩn thực sự đáng sử dụng.
Trước tiên, bạn cần đảm bảo rằng bạn có một ràng buộc khóa duy nhất tại chỗ. ON DUPLICATE KEY UPDATE
chức năng chỉ hoạt động nếu có một vi phạm khóa duy nhất.
Đây là định dạng thường được sử dụng:
$query = "INSERT INTO $table (column1, column2, column3)
VALUES ('value-1', 'value-2', 'value-3')
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);"
column1 = values(column1)
có nghĩa là "Cập nhật cột1 với giá trị sẽ được chèn nếu truy vấn không đạt đến vi phạm khóa trùng lặp." Nói cách khác, nó chỉ có nghĩa là cập nhật cột1 về những gì nó sẽ có khi chèn hoạt động.
Nhìn vào mã này, có vẻ như không đúng khi bạn đang cập nhật cả ba cột mà bạn đang cố chèn. Cột nào có ràng buộc duy nhất đối với nó?
CHỈNH SỬA:Sửa đổi dựa trên định dạng 'SET' của câu lệnh chèn mysql cho mỗi câu hỏi từ OP.
Về cơ bản để sử dụng ON DUPLICATE KEY UPDATE
, bạn chỉ cần viết câu lệnh chèn như bình thường nhưng thêm ON DUPLICATE KEY UPDATE
mệnh đề được gắn vào cuối. Tôi tin rằng nó sẽ hoạt động như thế này:
INSERT INTO $table
set column1 = 'value-1',
column2 = 'value-2',
column3 = 'value-3'
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);
Một lần nữa, một trong các cột bạn đang chèn phải có một chỉ mục duy nhất (hoặc kết hợp các cột). Điều đó có thể là do một trong số chúng là khóa chính hoặc vì có một chỉ mục duy nhất trên bảng.