Để đảm bảo chỉ chèn bản ghi mới nếu giá trị chưa tồn tại (tránh trùng lặp), cách chuẩn trong MySQL là tạo Unique Index trên cột (hoặc nhóm cột) cần duy nhất, sau đó dùng INSERT IGNORE hoặc INSERT ... ON DUPLICATE KEY UPDATE.
Tạo bảng và Unique Index
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(20)
);
mysql> CREATE UNIQUE INDEX idx_firstname ON DemoTable (FirstName);
Thử chèn dữ liệu (có trùng lặp)
mysql> INSERT INTO DemoTable (FirstName) VALUES ('Chris'); -- OK
mysql> INSERT INTO DemoTable (FirstName) VALUES ('Chris'); -- Lỗi Duplicate entry
ERROR 1062 (23000): Duplicate entry 'Chris' for key 'idx_firstname'
mysql> INSERT INTO DemoTable (FirstName) VALUES ('Robert'); -- OK
mysql> INSERT INTO DemoTable (FirstName) VALUES ('Mike'); -- OK
mysql> INSERT INTO DemoTable (FirstName) VALUES ('Robert'); -- Lỗi Duplicate entry
Kết quả bảng chỉ chứa giá trị duy nhất
mysql> SELECT * FROM DemoTable;
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | Chris |
| 2 | Robert |
| 3 | Mike |
+----+-----------+
Các phương pháp xử lý trùng lặp khác
1. INSERT IGNORE
Bỏ qua lỗi trùng lặp, không chèn, không báo lỗi:
INSERT IGNORE INTO DemoTable (FirstName) VALUES ('Chris');
2. INSERT ... ON DUPLICATE KEY UPDATE
Nếu trùng khóa duy nhất, cập nhật các cột khác (hoặc không làm gì):
INSERT INTO DemoTable (FirstName) VALUES ('Chris')
ON DUPLICATE KEY UPDATE FirstName = VALUES(FirstName);
3. Kiểm tra trước khi chèn (Application level)
SELECT COUNT(*) FROM DemoTable WHERE FirstName = 'Chris';
-- Nếu 0 thì INSERT
Cách này có race condition trong môi trường đa luồng, không khuyến khích cho hệ thống production.
Tóm lại: Tạo Unique Index là nền tảng. Sau đó chọn INSERT IGNORE (bỏ qua lặng lẽ) hoặc ON DUPLICATE KEY UPDATE (cập nhật) tùy theo logic nghiệp vụ.