สถานการณ์
ต้องการให้ชุดคอลัมน์ (id, Name, Age) ไม่มีค่าซ้ำกันในตาราง
วิธีแก้: ใช้ UNIQUE Constraint / Index
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1580 (
-> Id INT,
-> Name VARCHAR(20),
-> Age INT
-> );
Query OK, 0 rows affected (0.73 sec)
2. เพิ่ม UNIQUE Constraint (Composite)
mysql> ALTER TABLE DemoTable1580 ADD UNIQUE INDEX(id, Name, Age); Query OK, 0 rows affected (0.45 sec) Records: 0 Duplicates: 0 Warnings: 0
3. ทดสอบ Insert
mysql> INSERT INTO DemoTable1580 VALUES(101, 'Chris', 21); Query OK, 1 row affected (0.24 sec) mysql> INSERT INTO DemoTable1580 VALUES(102, 'Chris', 21); Query OK, 1 row affected (0.15 sec) -- Id ต่างกัน OK mysql> INSERT INTO DemoTable1580 VALUES(102, 'David', 21); Query OK, 1 row affected (0.49 sec) -- Name ต่างกัน OK mysql> INSERT INTO DemoTable1580 VALUES(101, 'Chris', 21); ERROR 1062 (23000): Duplicate entry '101-Chris-21' for key 'id'
4. ตรวจสอบข้อมูล
mysql> SELECT * FROM DemoTable1580;
ผลลัพธ์ (แถวสุดท้ายไม่ได้ Insert):
+------+-------+------+ | Id | Name | Age | +------+-------+------+ | 101 | Chris | 21 | | 102 | Chris | 21 | | 102 | David | 21 | +------+-------+------+ 3 rows in set (0.00 sec)
รูปแบบ UNIQUE Constraint
| Syntax | คำอธิบาย |
|---|---|
| UNIQUE (col) | Single Column Unique |
| UNIQUE (col1, col2, col3) | Composite Unique (ชุดคอลัมน์รวมกัน Unique) |
| CONSTRAINT uk_name UNIQUE (col1, col2) | ตั้งชื่อ Constraint เอง |
| ALTER TABLE ... ADD UNIQUE ... | เพิ่มหลังสร้างตาราง |
UNIQUE vs PRIMARY KEY
| คุณสมบัติ | PRIMARY KEY | UNIQUE |
|---|---|---|
| จำนวนต่อตาราง | 1 เท่านั้น | หลายอันได้ |
| NULL Allowed | ไม่ได้ (Implicit NOT NULL) | ได้ (หลาย NULL ได้ในบาง Version) |
| Clustered Index | Yes (InnoDB) | No (Secondary Index) |
| Auto Increment | ได้ | ไม่ได้ |
NULL ใน UNIQUE Constraint
- MySQL: อนุญาต Multiple NULL ใน UNIQUE Column (แต่ PRIMARY KEY ไม่ได้)
- Standard SQL: NULL ≠ NULL → ทุก NULL ถือว่า Unique
- หากต้องการ NULL เพียง 1 ค่า: ใช้ Partial Index (MySQL 8.0.13+) หรือ Trigger
กรณีการใช้งานจริง
- User: UNIQUE (Email), UNIQUE (Username)
- Product: UNIQUE (SKU), UNIQUE (Barcode)
- Order Item: UNIQUE (OrderId, ProductId) - ป้องกันสินค้าซ้ำในออเดอร์
- Schedule: UNIQUE (RoomId, StartTime, EndTime) - ป้องกันจองซ้ำ