Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การป้องกันแถวซ้ำใน MySQL INSERT ด้วย UNIQUE KEY

ใช้ 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
INSERTError 1062, หยุดทำงาน
INSERT IGNOREWarning, ข้ามแถวนั้น ไปต่อ
INSERT ... ON DUPLICATE KEY UPDATEUpdate แถวเดิม แทน Insert ใหม่
REPLACEDelete แถวเก่า + 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 ต่อและ เพื่อความชัดเจนและหลีกเลี่ยงข้อมูลซ้ำที่มีอยู่แล้ว