Hướng dẫn what is on duplicate key update in mysql? - cập nhật khóa trùng lặp trong mysql là gì?

13.2.6.2 & nbsp; chèn ... về câu lệnh cập nhật khóa trùng lặp

Nếu bạn chỉ định một mệnh đề

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1 và một hàng được chèn sẽ gây ra giá trị trùng lặp trong chỉ số
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
2 hoặc
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
3, một
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
4 của hàng cũ xảy ra. Ví dụ: nếu cột
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
5 được khai báo là
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
2 và chứa giá trị
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
7, hai câu sau đây có hiệu ứng tương tự:

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE t1 SET c=c+1 WHERE a=1;

Các hiệu ứng không hoàn toàn giống nhau: đối với bảng

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
8 trong đó
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
5 là cột tự động, câu lệnh
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
0 làm tăng giá trị tự động tăng nhưng
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
4 thì không.

Nếu cột

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
2 cũng là duy nhất,
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
0 tương đương với câu lệnh
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
4 này: thay vào đó:

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

Nếu

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
5 khớp với một số hàng, chỉ có một hàng được cập nhật. Nói chung, bạn nên cố gắng tránh sử dụng mệnh đề
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1 trên các bảng có nhiều chỉ mục duy nhất.one row is updated. In general, you should try to avoid using an
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1 clause on tables with multiple unique indexes.

Với

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1, giá trị hàng bị ảnh hưởng trên mỗi hàng là 1 nếu hàng được chèn dưới dạng hàng mới, 2 nếu một hàng hiện tại được cập nhật và 0 nếu một hàng hiện tại được đặt thành các giá trị hiện tại của nó. Nếu bạn chỉ định cờ
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
8 cho hàm API
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
9 C khi kết nối với MySQLD, giá trị hàng bị ảnh hưởng là 1 (không phải 0) nếu một hàng hiện tại được đặt thành các giá trị hiện tại của nó.mysqld, the affected-rows value is 1 (not 0) if an existing row is set to its current values.

Nếu một bảng chứa cột

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
0 và
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
1 chèn hoặc cập nhật một hàng, hàm
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
2 sẽ trả về giá trị
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
0.

Điều khoản

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1 có thể chứa nhiều gán cột, được phân tách bằng dấu phẩy.

Trong các biểu thức giá trị gán trong mệnh đề

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
5, bạn có thể sử dụng hàm
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
6) để chỉ các giá trị cột từ phần
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
0 của câu lệnh
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
8. Nói cách khác,
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
6) trong mệnh đề
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1 đề cập đến giá trị của
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
1 sẽ được chèn vào, không có xung đột nào xảy ra xung đột. Chức năng này đặc biệt hữu ích trong các chèn nhiều hàng. Hàm
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
2 chỉ có ý nghĩa trong Điều khoản
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1 hoặc các câu lệnh
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
0 và trả về
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
5 nếu không. Thí dụ:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

Tuyên bố đó giống hệt với hai câu sau:

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;

Ghi chú

Việc sử dụng

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
2 để tham khảo hàng mới và các cột được không dùng để bắt đầu với MySQL 8.0.20 và có thể loại bỏ trong một phiên bản tương lai của MySQL. Thay vào đó, sử dụng các bí danh hàng và cột, như được mô tả trong một vài đoạn tiếp theo của phần này.

Bắt đầu với MySQL 8.0.19, có thể sử dụng bí danh cho hàng, với, tùy chọn, một hoặc nhiều cột của nó được chèn, theo điều khoản

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
7 hoặc
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
8 và trước từ khóa
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
9. Sử dụng bí danh hàng
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;
0, câu lệnh được hiển thị trước đây bằng cách sử dụng
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
2 để truy cập các giá trị cột mới có thể được viết trong biểu mẫu hiển thị ở đây:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

Ngoài ra, bạn sử dụng các bí danh cột

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;
2,
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;
3 và
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;
4, bạn có thể bỏ qua bí danh hàng trong mệnh đề gán và viết cùng một câu như thế này:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

Khi sử dụng các bí danh cột theo kiểu này, bạn vẫn phải sử dụng một bí danh hàng theo mệnh đề

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
7, ngay cả khi bạn không sử dụng trực tiếp nó trong mệnh đề gán.

Bắt đầu với MySQL 8.0.20, một câu lệnh

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;
6 sử dụng
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
2 trong mệnh đề
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
4, như câu này, đưa ra cảnh báo:

INSERT INTO t1
  SELECT c, c+d FROM t2
  ON DUPLICATE KEY UPDATE b = VALUES(b);

Bạn có thể loại bỏ các cảnh báo như vậy bằng cách sử dụng một trình điều khiển con thay vào đó, như thế này:

INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;

Bạn cũng có thể sử dụng các bí danh hàng và cột với mệnh đề

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
8, như đã đề cập trước đây. Sử dụng
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
8 thay vì
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
7 trong hai câu
INSERT INTO t1
  SELECT c, c+d FROM t2
  ON DUPLICATE KEY UPDATE b = VALUES(b);
2 vừa được hiển thị có thể được thực hiện như thể hiện ở đây:

INSERT INTO t1 SET a=1,b=2,c=3 AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

INSERT INTO t1 SET a=1,b=2,c=3 AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

Bí danh hàng không được giống như tên của bảng. Nếu các bí danh cột không được sử dụng hoặc nếu chúng giống như tên cột, chúng phải được phân biệt bằng bí danh hàng trong mệnh đề

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
1. Các bí danh cột phải là duy nhất liên quan đến bí danh hàng mà chúng áp dụng (nghĩa là không có bí danh cột nào đề cập đến các cột của cùng một hàng có thể giống nhau).

Đối với các câu lệnh

INSERT INTO t1
  SELECT c, c+d FROM t2
  ON DUPLICATE KEY UPDATE b = VALUES(b);
4, các quy tắc này được áp dụng liên quan đến các biểu thức truy vấn
INSERT INTO t1
  SELECT c, c+d FROM t2
  ON DUPLICATE KEY UPDATE b = VALUES(b);
5 chấp nhận được mà bạn có thể tham khảo trong một điều khoản
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
5:

  • Các tham chiếu đến các cột từ các truy vấn trên một bảng, có thể là một bảng dẫn xuất.

  • Tài liệu tham khảo các cột từ các truy vấn trên một tham gia trên nhiều bảng.

  • Tham chiếu đến các cột từ các truy vấn

    INSERT INTO t1
      SELECT c, c+d FROM t2
      ON DUPLICATE KEY UPDATE b = VALUES(b);
    7.

  • Các tham chiếu đến các cột trong các bảng khác, miễn là

    INSERT INTO t1
      SELECT c, c+d FROM t2
      ON DUPLICATE KEY UPDATE b = VALUES(b);
    5 không sử dụng
    INSERT INTO t1
      SELECT c, c+d FROM t2
      ON DUPLICATE KEY UPDATE b = VALUES(b);
    9. Một tác dụng phụ là bạn phải đủ điều kiện tham khảo tên cột Nonunique.

Các tham chiếu đến các cột từ

INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
0 không được hỗ trợ. Để làm việc xung quanh hạn chế này, hãy viết lại
INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
0 dưới dạng bảng dẫn xuất để các hàng của nó có thể được coi là một tập kết quả bảng đơn. Ví dụ: câu lệnh này tạo ra một lỗi:

INSERT INTO t1 (a, b)
  SELECT c, d FROM t2
  UNION
  SELECT e, f FROM t3
ON DUPLICATE KEY UPDATE b = b + c;

Thay vào đó, hãy sử dụng một câu lệnh tương đương viết lại

INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
0 dưới dạng bảng dẫn xuất:

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
0

Kỹ thuật viết lại một truy vấn như một bảng dẫn xuất cũng cho phép tham chiếu đến các cột từ các truy vấn

INSERT INTO t1
  SELECT c, c+d FROM t2
  ON DUPLICATE KEY UPDATE b = VALUES(b);
9.

Bởi vì kết quả của các câu lệnh

INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
4 phụ thuộc vào thứ tự các hàng từ
INSERT INTO t1
  SELECT c, c+d FROM t2
  ON DUPLICATE KEY UPDATE b = VALUES(b);
5 và thứ tự này không thể luôn luôn được đảm bảo, có thể khi đăng nhập các câu lệnh
INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
6 cho nguồn và bản sao để phân kỳ. Do đó, các câu lệnh
INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
6 được gắn cờ là không an toàn cho sao chép dựa trên tuyên bố. Các câu lệnh như vậy tạo ra cảnh báo trong nhật ký lỗi khi sử dụng chế độ dựa trên câu lệnh và được ghi vào nhật ký nhị phân bằng định dạng dựa trên hàng khi sử dụng chế độ
INSERT INTO t1
  SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
  ON DUPLICATE KEY UPDATE b = e;
8. Một câu lệnh
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
8 đối với bảng có nhiều hơn một khóa duy nhất hoặc khóa chính cũng được đánh dấu là không an toàn. (Lỗi #11765650, lỗi #58637)

Xem thêm Phần & NBSP; 17.2.1.1, Ưu điểm và nhược điểm của bản sao dựa trên tuyên bố và dựa trên hàng.

SQL khóa trùng lặp là gì?

Chèn trên câu lệnh cập nhật khóa trùng lặp là phần mở rộng của câu lệnh chèn trong MySQL. Khi chúng tôi chỉ định mệnh đề cập nhật khóa trùng lặp ON trong câu lệnh SQL và một hàng sẽ gây ra giá trị lỗi trùng lặp trong cột chỉ mục khóa duy nhất hoặc chính, sau đó việc cập nhật hàng hiện tại xảy ra.the extension of the INSERT statement in MySQL. When we specify the ON DUPLICATE KEY UPDATE clause in a SQL statement and a row would cause duplicate error value in a UNIQUE or PRIMARY KEY index column, then updation of the existing row occurs.

Mục nhập trùng lặp có nghĩa là gì trong MySQL?

Khi tạo khóa chính hoặc ràng buộc duy nhất sau khi tải dữ liệu, bạn có thể nhận được một mục nhập trùng lặp cho lỗi 'chính' chính.Nếu dữ liệu trong cơ sở dữ liệu nguồn hợp lệ và không có bất kỳ bản sao nào bạn nên kiểm tra đối chiếu nào được sử dụng trong cơ sở dữ liệu MySQL của bạn., you can get a “Duplicate entry for key 'PRIMARY'” error. If the data in the source database is valid and there are no any duplicates you should check which collation is used in your MySQL database.

Là chèn vào bản cập nhật khóa trùng lặp nguyên tử?

Theo định nghĩa, tính nguyên tử yêu cầu mỗi giao dịch là tất cả hoặc không có gì.Vì vậy, có nguyên tử theo nghĩa là nếu dữ liệu mà bạn đang cố gắng chèn sẽ gây ra sự trùng lặp trong khóa chính hoặc trong chỉ mục duy nhất, câu lệnh thay vào đó sẽ thực hiện cập nhật và không lỗi.yes it is atomic in the sense that if the data that you are trying to insert will cause a duplicate in the primary key or in the unique index, the statement will instead perform an update and not error out.

Khóa trùng lặp là gì?

Bản sao khóa đề cập đến quá trình tạo khóa dựa trên khóa hiện có.the process of creating a key based on an existing key.