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

การป้องกันการ Insert ค่าซ้ำแบบคู่ (Composite Unique) ใน MySQL

ใช้ UNIQUE CONSTRAINT บนหลายคอลัมน์ร่วมกัน (Composite Unique) เพื่อป้องกันการ Insert ชุดค่าซ้ำ

Syntax

alter table yourTableName add constraint yourConstraintName unique(yourColumnName1,yourColumnName2,....N);

สร้างตารางตัวอย่าง

mysql> create table DemoTable ( 
    Value1 int, 
    Value2 int ); 
Query OK, 0 rows affected (0.47 sec)

เพิ่ม UNIQUE Constraint แบบ Composite

mysql> alter table DemoTable add constraint Value1_Value2_ConstraintKey unique(Value1,Value2); 
Query OK, 0 rows affected (0.80 sec)
Records: 0  Duplicates: 0  Warnings: 0

ทดสอบ Insert (คู่ที่ 10,10 ซ้ำ)

mysql> insert into DemoTable values(10,10); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(10,20); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(10,10); ERROR 1062 (23000) : Duplicate entry '10-10' for key 'Value1_Value2_ConstraintKey'
mysql> insert into DemoTable values(20,10); Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(20,20); Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(20,10); ERROR 1062 (23000) : Duplicate entry '20-10' for key 'Value1_Value2_ConstraintKey'

แสดงข้อมูลที่ Insert สำเร็จ

mysql> select *from DemoTable;
+--------+--------+
| Value1 | Value2 |
+--------+--------+
|     10 |     10 |
|     10 |     20 |
|     20 |     10 |
|     20 |     20 |
+--------+--------+
4 rows in set (0.00 sec)

คำอธิบาย

  • Unique Constraint บน (Value1, Value2) หมายถึง คู่ (Value1, Value2) ต้องไม่ซ้ำ
  • (10,10) และ (10,10) ซ้ำ → Error
  • (10,20) และ (20,10) ไม่ซ้ำ → OK
  • แตกต่างจาก Unique แยกคอลัมน์: UNIQUE(Value1), UNIQUE(Value2) จะห้าม Value1 ซ้ำ และ Value2 ซ้ำ แยกกัน

สร้างตารางพร้อม Constraint ทั้งหมด

CREATE TABLE DemoTable (
    Value1 INT,
    Value2 INT,
    CONSTRAINT uk_value_pair UNIQUE (Value1, Value2)
);

INSERT IGNORE / ON DUPLICATE KEY UPDATE

-- ข้ามแถวซ้ำ
INSERT IGNORE INTO DemoTable VALUES (10, 10);

-- อัปเดตเมื่อซ้ำ
INSERT INTO DemoTable VALUES (10, 10) 
ON DUPLICATE KEY UPDATE Value2 = Value2 + 1;

ข้อควรระวัง

  • NULL ใน Unique Constraint: MySQL อนุญาตให้มีหลายแถวที่มี NULL ในคอลัมน์ Unique (ยกเว้น Primary Key)
  • ลำดับคอลัมน์ใน Constraint สำคัญต่อ Index usage