2013-05-04 36 views
16

Từ MySQL 4.1.0 trở đi, có thể thêm tuyên bố ON DUPLICATE KEY UPDATE để chỉ định hành vi khi các giá trị được chèn (với INSERT hoặc SET hoặc VALUES) đã có trong bảng đích w.r.t. PRIMARY KEY hoặc một số trường UNIQUE. Nếu giá trị cho PRIMARY KEY hoặc một số trường UNIQUE đã có trong bảng, INSERT được thay thế bằng UPDATE.Hành vi MySQL của ON UPPLYATE BẬT cho nhiều trường UNIQUE

  • như thế nào ON DUPLICATE KEY UPDATE cư xử trong trường hợp có nhiều UNIQUE trường trong bảng của tôi?

  • Tôi chỉ có thể có một bản cập nhật nếu trường UNIQUE khớp với nhau?

  • Tôi chỉ có thể cập nhật nếu cả hai trường UNIQUE được đối sánh đồng thời?

Trả lời

20

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.

+1

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

+2

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

0
  1. cách hoạt động của MySQL ... Nó hoạt động như mong đợi, được thực hiện theo mệnh đề KEY DUPLICATE.

  2. Tôi có thể có một bản cập nhật cho một ... Trong thực tế, bạn chỉ có một mệnh đề ON DUPLICATE KEY, vì vậy bạn cần đặt một số mã để phân biệt ràng buộc nào có liên quan. Fortunatelly, có thể. Điều duy nhất bạn nên biết, thứ tự của các vấn đề chuyển nhượng, và bạn có thể gán nhiều lần. Giả sử, bạn có ràng buộc duy nhất trên a và b và bạn muốn cập nhật c chỉ khi tính duy nhất có liên quan: ... CẬP NHẬT CHÍNH c = IF (a = VALUES (a) và b <> VALUES (b), VALUES (c), c), b = VALUES (b)

    nhưng nếu bạn thay đổi thứ tự các nhiệm vụ, điều kiện thứ hai bên trong nếu sẽ luôn sai.

  3. Xem 2.

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