Ràng buộc UNIQUE (trên 1 hoặc nhiều cột) đảm bảo không có 2 hàng có cùng giá trị trên bộ cột đó. Khác với PRIMARY KEY: cho phép NULL (trừ MySQL 5.7+ với InnoDB), và một bảng có thể có nhiều UNIQUE constraint.
Ví dụ minh họa
Tạo bảng:
CREATE TABLE DemoTable1580 (id INT, Name VARCHAR(20), Age INT);
Thêm UNIQUE constraint trên 3 cột (composite unique):
ALTER TABLE DemoTable1580 ADD UNIQUE INDEX (id, Name, Age);
Chèn dữ liệu:
INSERT INTO DemoTable1580 VALUES (101, 'Chris', 21); -- OK INSERT INTO DemoTable1580 VALUES (102, 'Chris', 21); -- OK (id khác) INSERT INTO DemoTable1580 VALUES (102, 'David', 21); -- OK (Name khác) INSERT INTO DemoTable1580 VALUES (101, 'Chris', 21); -- LỖI: trùng (101, Chris, 21)
Kết quả
ERROR 1062 (23000): Duplicate entry '101-Chris-21' for key 'id'
| id | Name | Age |
|---|---|---|
| 101 | Chris | 21 |
| 102 | Chris | 21 |
| 102 | David | 21 |
Các cách tạo UNIQUE
-- Khi CREATE TABLE CREATE TABLE t (a INT, b INT, UNIQUE(a,b)); -- ALTER TABLE ALTER TABLE t ADD UNIQUE (a,b); ALTER TABLE t ADD CONSTRAINT uk_a_b UNIQUE (a,b); -- Đặt tên constraint -- PRIMARY KEY cũng là UNIQUE + NOT NULL CREATE TABLE t (a INT PRIMARY KEY, b INT);
Lưu ý về NULL
- MySQL cho phép nhiều NULL trong cột UNIQUE (vì NULL ≠ NULL).
- Nếu cần UNIQUE không cho NULL:
ALTER TABLE t MODIFY a INT NOT NULL; ADD UNIQUE(a);
Xử lý trùng lặp khi INSERT
INSERT IGNORE: Bỏ qua hàng trùng, không báo lỗi.INSERT ... ON DUPLICATE KEY UPDATE: Cập nhật nếu trùng (xem bài 1003075171).REPLACE INTO: Xóa hàng cũ, chèn hàng mới (cẩn thận: trigger DELETE + INSERT).