UNIQUE Constraint รับประกันว่าไม่มีค่าซ้ำในคอลัมน์ (หรือชุดคอลัมน์) ยกเว้น NULL (อนุญาต Multiple NULLs)
สร้างตารางพร้อม UNIQUE Constraint
Column Level
CREATE TABLE UniqueConstDemo (
name VARCHAR(100) UNIQUE
);
Table Level (แนะนำ - ตั้งชื่อ Constraint ได้)
CREATE TABLE UniqueConstDemo (
name VARCHAR(100),
CONSTRAINT uk_name UNIQUE (name)
);
Composite Unique (หลายคอลัมน์)
CREATE TABLE user_emails (
user_id INT,
email VARCHAR(255),
email_type ENUM('primary', 'secondary'),
CONSTRAINT uk_user_email_type UNIQUE (user_id, email_type)
-- หนึ่ง User มี Primary Email ได้แค่ 1
);
ทดสอบ Constraint
INSERT INTO UniqueConstDemo VALUES ('John'); -- OK
INSERT INTO UniqueConstDemo VALUES ('John'); -- ERROR 1062 (23000): Duplicate entry 'John' for key 'name'
INSERT INTO UniqueConstDemo VALUES ('Bob'); -- OK
SELECT * FROM UniqueConstDemo;
+-------+
| name |
+-------+
| Bob |
| John |
+-------+
เพิ่ม UNIQUE Constraint ในตารางที่มีอยู่
ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email);
-- หรือ (ไม่ตั้งชื่อ)
ALTER TABLE users ADD UNIQUE (email);
ลบ UNIQUE Constraint
ALTER TABLE users DROP INDEX uk_email;
-- MySQL ใช้ DROP INDEX สำหรับ Unique Constraint ด้วย
UNIQUE vs PRIMARY KEY
| คุณสมบัติ | PRIMARY KEY | UNIQUE KEY |
|---|---|---|
| จำนวนต่อตาราง | 1 เท่านั้น | หลายอันได้ |
| NULL Allowed | ❌ ห้าม | ✅ ได้ (Multiple NULLs) |
| Clustered Index (InnoDB) | ✅ ใช่ | ❌ Secondary Index |
| Auto Increment | รองรับ | ไม่รองรับ |
NULL Handling ใน UNIQUE
INSERT INTO UniqueConstDemo VALUES (NULL); -- OK
INSERT INTO UniqueConstDemo VALUES (NULL); -- OK (Multiple NULLs Allowed)
-- ถ้าต้องการ Unique + Not Null
CREATE TABLE t (name VARCHAR(100) NOT NULL UNIQUE);
Error Handling ใน Application
-- MySQL Error Code: 1062 (ER_DUP_ENTRY)
-- SQLSTATE: 23000
-- PHP PDO
try {
$pdo->exec("INSERT INTO users (email) VALUES ('dup@test.com')");
} catch (PDOException $e) {
if ($e->getCode() == 23000) {
echo "Email already exists";
}
}