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

ทำให้คอลัมน์มีค่า Unique ใน MySQL (UNIQUE Constraint)

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 KEYUNIQUE 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";
    }
}