ใช้ 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