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

UNIQUE constraint và INSERT nhiều hàng trùng lặp trong MySQL: toàn bộ bị hủy

Khi INSERT nhiều hàng trong 1 câu lệnh (multi-row insert) và có ràng buộc UNIQUE, nếu bất kỳ hàng nào vi phạm, toàn bộ câu lệnh bị rollback — không hàng nào được chèn.

Ví dụ minh họa

Tạo bảng có UNIQUE trên StudentId:

CREATE TABLE DemoTable1585 (
    StudentId INT,
    StudentMarks INT,
    UNIQUE(StudentId)
);

Chèn 4 hàng, trong đó hàng 4 trùng StudentId=3:

INSERT INTO DemoTable1585 VALUES (1,87), (2,98), (3,91), (3,48);

Kết quả

ERROR 1062 (23000): Duplicate entry '3' for key 'StudentId'

Kiểm tra bảng:

SELECT * FROM DemoTable1585;
StudentIdStudentMarks

→ Bảng rỗng! 3 hàng đầu cũng không được chèn.

Giải thích

  • MySQL thực hiện multi-row insert như một transaction đơn lẻ (atomic).
  • Vi phạm ràng buộc → rollback toàn bộ.
  • Khác với INSERT riêng lẻ (mỗi câu 1 hàng) — hàng trước vẫn commit được.

Cách xử lý

1. INSERT IGNORE (bỏ qua hàng lỗi)

INSERT IGNORE INTO DemoTable1585 VALUES (1,87), (2,98), (3,91), (3,48);

→ Chèn 3 hàng đầu, bỏ qua hàng 4. Trả về Warning.

2. ON DUPLICATE KEY UPDATE (cập nhật nếu trùng)

INSERT INTO DemoTable1585 VALUES (1,87), (2,98), (3,91), (3,48)
ON DUPLICATE KEY UPDATE StudentMarks = VALUES(StudentMarks);

→ Hàng 4 cập nhật StudentMarks của Id=3 thành 48.

3. Chèn từng hàng riêng biệt (application level)

Try-catch từng INSERT trong code ứng dụng.

⚠️ Cảnh báo

INSERT IGNORE cũng bỏ qua các lỗi khác (FK violation, data truncation...). Dùng cẩn thận.