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

รับรองความ Unique ของแถวด้วย UNIQUE Constraint ใน MySQL


สถานการณ์

ต้องการให้ชุดคอลัมน์ (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) - ป้องกันจองซ้ำ