Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Có thể INSERT và UPDATE trong cùng một truy vấn MySQL?

INSERT ... ON DUPLICATE KEY UPDATE trong MySQL

Có, MySQL hỗ trợ thực hiện INSERT và UPDATE trong cùng một câu lệnh bằng mệnh đề ON DUPLICATE KEY UPDATE. Cơ chế: nếu khóa chính (PRIMARY KEY) hoặc khóa duy nhất (UNIQUE KEY) đã tồn tại, MySQL sẽ thực hiện UPDATE thay vì INSERT mới.

Ví dụ minh họa

Tạo bảng DemoTable với khóa chính Id:

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL PRIMARY KEY,
    Number INT
);
Query OK, 0 rows affected (0.83 sec)

Thực hiện INSERT với ON DUPLICATE KEY UPDATE:

mysql> INSERT INTO DemoTable VALUES(1, 190) ON DUPLICATE KEY UPDATE Number = Number + 10;
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO DemoTable VALUES(2, 130) ON DUPLICATE KEY UPDATE Number = Number + 10;
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO DemoTable VALUES(1, 190) ON DUPLICATE KEY UPDATE Number = Number + 10;
Query OK, 2 rows affected (0.14 sec)
mysql> INSERT INTO DemoTable VALUES(2, 130) ON DUPLICATE KEY UPDATE Number = Number + 10;
Query OK, 2 rows affected (0.17 sec)

Kết quả - bản ghi Id=1 và Id=2 được cập nhật thay vì tạo mới:

mysql> SELECT * FROM DemoTable;
+----+--------+
| Id | Number |
+----+--------+
| 1  | 200    |
| 2  | 140    |
+----+--------+
2 rows in set (0.00 sec)

Giải thích

  • Lần 1: INSERT Id=1, Number=190 → thành công (1 row affected)
  • Lần 2: INSERT Id=2, Number=130 → thành công (1 row affected)
  • Lần 3: INSERT Id=1 (trùng khóa) → UPDATE Number = 190+10 = 200 (2 rows affected)
  • Lần 4: INSERT Id=2 (trùng khóa) → UPDATE Number = 130+10 = 140 (2 rows affected)

Lưu ý quan trọng

  • Bảng phải có PRIMARY KEY hoặc UNIQUE INDEX
  • Giá trị rows affected: 1 = INSERT mới, 2 = UPDATE đã có
  • Có thể cập nhật nhiều cột: ON DUPLICATE KEY UPDATE col1=val1, col2=val2
  • Sử dụng VALUES(ten_cot) để tham chiếu giá trị được INSERT: UPDATE Number = VALUES(Number) + 10