ใช้ UNIQUE KEY บนคอลัมน์ที่ต้องการให้ค่าไม่ซ้ำ ร่วมกับ INSERT IGNORE เพื่อข้ามแถวซ้ำ
สร้างตารางพร้อม UNIQUE KEY
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(30),
UNIQUE KEY(FirstName) );
Query OK, 0 rows affected (1.76 sec)
Insert ข้อมูล (มีค่าซ้ำ)
mysql> insert ignore into DemoTable(FirstName) values('Chris'); Query OK, 1 row affected (0.42 sec)
mysql> insert ignore into DemoTable(FirstName) values('David'); Query OK, 1 row affected (0.12 sec)
mysql> insert ignore into DemoTable(FirstName) values('Chris'); Query OK, 0 rows affected, 1 warning (0.17 sec)
mysql> insert ignore into DemoTable(FirstName) values('Sam'); Query OK, 1 row affected (0.11 sec)
mysql> insert ignore into DemoTable(FirstName) values('David'); Query OK, 0 rows affected, 1 warning (0.07 sec)
แสดงข้อมูล (ไม่มีค่าซ้ำ)
mysql> select *from DemoTable;
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | David | | 4 | Sam | +----+-----------+ 3 rows in set (0.00 sec)
INSERT IGNORE vs INSERT ธรรมดา
| คำสั่ง | พฤติกรรมเมื่อ Duplicate Key |
|---|---|
INSERT | Error 1062, หยุดทำงาน |
INSERT IGNORE | Warning, ข้ามแถวนั้น ไปต่อ |
INSERT ... ON DUPLICATE KEY UPDATE | Update แถวเดิม แทน Insert ใหม่ |
REPLACE | Delete แถวเก่า + Insert ใหม่ (Auto Increment เปลี่ยน) |
ตัวอย่าง ON DUPLICATE KEY UPDATE
INSERT INTO DemoTable (FirstName) VALUES ('Chris')
ON DUPLICATE KEY UPDATE FirstName = 'Chris'; -- ไม่ทำอะไร แค่นับว่า Updated
ข้อควรระวัง
INSERT IGNOREยัง Generate Auto Increment ID (มีช่องว่าง ID)- Unique Key บน VARCHAR: ความยาวสูงสุด 3072 bytes (ขึ้นกับ charset)
- Case Sensitivity ขึ้นกับ Collation (utf8mb4_general_ci = case insensitive)
Best Practice
สร้าง UNIQUE CONSTRAINT ตอน CREATE TABLE แทน ALTER ต่อและ เพื่อความชัดเจนและหลีกเลี่ยงข้อมูลซ้ำที่มีอยู่แล้ว