Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hành vi của MySQL về CẬP NHẬT KHÓA KÉP BẬT cho nhiều trường DUY NHẤT

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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Cách chèn vào nhiều bảng bằng khóa ngoại

  2. Tính tổng kết quả của một vài truy vấn và sau đó tìm ra top 5 trong SQL

  3. Cách lấy kích thước của bảng trong MySQL

  4. Cách NOT REGEXP hoạt động trong MySQL

  5. Chọn giá trị phổ biến nhất từ ​​một trường trong MySQL