2009-01-16 37 views
59

tôi muốn làm một cái gì đó như thế nàyINSERT INTO .. ​​ON DUPLICATE CẬP NHẬT KEY cho nhiều mục

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value') 
ON DUPLICATE KEY UPDATE 
t.c = 'value'; 
INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = 'value2'; 

t.a và t.b là chìa khóa. Điều này tất cả các công trình tốt nhưng tôi nhận được một lỗi trên chèn thứ hai. Với phpMyAdmin một truy vấn như thế này hoạt động tốt nhưng tôi đoán nó chạy các truy vấn một cách độc lập vì nó in ra các kết quả từ truy vấn đó như ý kiến?

Một cái gì đó như thế này cũng sẽ tốt nhưng tôi sẽ cần phải có các giá trị khác nhau cho mỗi mục. Tôi thích điều này nhưng tôi không chắc chắn làm thế nào tôi có thể thay đổi giá trị trên cập nhật cho mỗi giá trị.

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value'), ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = ??? 

Vấn đề nằm trong dấu hỏi, tôi nên đặt gì ở đây để mỗi lần chèn/cập nhật sẽ có giá trị chính xác? Rõ ràng nếu tôi đặt một giá trị ở đó tất cả các trường sẽ nhận được giá trị đó.

Nếu có một cách khác để thực hiện "cập nhật nếu tồn tại, nếu không chèn" truy vấn trên nhiều trường bằng hai khóa, tôi cũng sẽ đưa ra các ý tưởng khác. Tôi đoán tôi có thể chạy mỗi truy vấn riêng biệt (như phpMyAdmin?) Nhưng nó sẽ có rất nhiều truy vấn vì vậy tôi thực sự muốn tránh điều đó.

Trả lời

139

sử dụng giá trị() chức năng

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value'), ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = VALUES(t.c) 

thấy http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

+2

Tuyệt vời! Và damn bạn SQL cho được như vậy damn unintuitive ... – pixelfreak

+2

mysql INSERT INTO param (id, num) GIÁ TRỊ (3,4) TRÊN KHIẾU NẠI CHÍNH CẬP NHẬT id = GIÁ TRỊ ( d) +222; Truy vấn OK, 2 hàng bị ảnh hưởng (0,67 giây) – zloctb

36

Quá thấp trên đại diện cho bình luận, nhưng tôi muốn thêm một cú pháp hơi phức tạp hơn đã được lấy cảm hứng từ @ ʞɔıu phản ứng. Để cập nhật nhiều trường trên khóa trùng lặp:

INSERT INTO t (t.a, t.b, t.c, t.d) 
VALUES ('key1','key2','value','valueb'), ('key1','key3','value2','value2b') 
ON DUPLICATE KEY UPDATE 
t.c = VALUES(t.c), 
t.d = VALUES(t.d) 

Mong rằng sẽ giúp ai đó thực hiện chèn hàng loạt với nhiều lần cập nhật khóa trùng lặp. Cú pháp đã thoát khỏi tôi.

Các vấn đề liên quan