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;
| StudentId | StudentMarks |
|---|
→ 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.