Ràng buộc UNIQUE trong SQL Server
Trong hướng dẫn này, bạn sẽ học cách sử dụng ràng buộc UNIQUE
trong SQL Server để đảm bảo tính duy nhất của dữ liệu chứa trong một cột hoặc một nhóm cột.
Giới thiệu về ràng buộc UNIQUE SQL Server
Ràng buộc UNIQUE
của SQL Server cho phép bạn đảm bảo rằng dữ liệu được lưu trữ trong một cột hoặc một nhóm cột, là duy nhất giữa các hàng trong bảng.
Câu lệnh sau tạo một bảng có dữ liệu trong cột email
là duy nhất giữa các hàng trong bảng hr.persons
:
CREATE SCHEMA hr;
GO
CREATE TABLE hr.persons(
person_id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE
);
Trong cú pháp này, bạn xác định ràng buộc UNIQUE
là một ràng buộc cột. Bạn cũng có thể xác định ràng buộc UNIQUE
dưới dạng ràng buộc bảng, như sau:
CREATE TABLE hr.persons(
person_id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255),
UNIQUE(email)
);
SQL Server tự động tạo một index UNIQUE
để thực thi tính duy nhất của dữ liệu được lưu trữ trong các cột tham gia vào ràng buộc UNIQUE
. Do đó, nếu bạn cố gắng insert một hàng trùng lặp, SQL Server sẽ từ chối và trả về thông báo lỗi cho biết ràng buộc UNIQUE
đã bị vi phạm.
Câu lệnh sau sẽ insert một hàng mới vào bảng hr.persons
:
INSERT INTO hr.persons(first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Câu lệnh hoạt động như mong đợi. Tuy nhiên, câu lệnh sau không thành công do email bị trùng lặp:
INSERT INTO hr.persons(first_name, last_name, email)
VALUES('Jane','Doe','[email protected]');
SQL Server đã đưa ra thông báo lỗi sau:
Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Nếu bạn không chỉ định tên cho ràng buộc UNIQUE
, SQL Server sẽ tự động tạo tên cho nó. Trong ví dụ này, tên ràng buộc là UQ__persons__AB6E616417240E4E
, không thể đọc được.
Để gán một tên cụ thể cho một ràng buộc UNIQUE
, bạn sử dụng từ khóa CONSTRAINT
như sau:
CREATE TABLE hr.persons (
person_id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255),
CONSTRAINT unique_email UNIQUE(email)
);
Sau đây là những lợi ích của việc gán tên cụ thể cho một ràng buộc UNIQUE
:
- Nó dễ dàng hơn để phân loại thông báo lỗi.
- Bạn có thể tham chiếu tên ràng buộc khi bạn muốn sửa đổi nó.
Ràng buộc UNIQUE so với ràng buộc PRIMARY KEY
Mặc dù cả hai ràng buộc UNIQUE
và PRIMARY KEY
thực thi tính duy nhất của dữ liệu, bạn nên sử dụng ràng buộc UNIQUE
thay vì ràng buộc PRIMARY KEY
khi bạn muốn thực thi tính duy nhất của một cột hoặc một nhóm cột không phải là cột khóa chính.
Khác với ràng buộc PRIMARY KEY
, ràng buộc UNIQUE
cho phép NULL
. Hơn nữa, các ràng buộc UNIQUE
coi NULL
như một giá trị thông thường, do đó, nó chỉ cho phép một giá trị NULL
trên mỗi cột.
Câu lệnh sau sẽ insert một hàng có giá trị trong cột email
là NULL
:
INSERT INTO hr.persons(first_name, last_name)
VALUES('John','Smith');
Bây giờ, nếu bạn cố gắng insert thêm một giá trị NULL
vào cột email
, bạn sẽ gặp lỗi:
INSERT INTO hr.persons(first_name, last_name)
VALUES('Lily','Bush');
Đây là kết quả:
Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
Ràng buộc UNIQUE cho một nhóm cột
Để tạo ràng buộc UNIQUE
cho một nhóm cột, bạn viết nó dưới dạng ràng buộc bảng với các tên cột được phân tách bằng dấu phẩy như sau:
CREATE TABLE table_name (
key_column data_type PRIMARY KEY,
column1 data_type,
column2 data_type,
column3 data_type,
...,
UNIQUE (column1,column2)
);
Ví dụ sau tạo một ràng buộc UNIQUE
bao gồm hai cột person_id
và skill_id
:
CREATE TABLE hr.person_skills (
id INT IDENTITY PRIMARY KEY,
person_id int,
skill_id int,
updated_at DATETIME,
UNIQUE (person_id, skill_id)
);
Thêm các ràng buộc UNIQUE
vào các cột hiện có
Khi bạn thêm một ràng buộc UNIQUE
vào cột hiện có hoặc một nhóm cột trong bảng, SQL Server trước tiên sẽ kiểm tra dữ liệu hiện có trong các cột này để đảm bảo rằng tất cả các giá trị là duy nhất. Nếu SQL Server tìm thấy các giá trị trùng lặp thì nó sẽ trả về lỗi và không thêm ràng buộc UNIQUE
.
Sau đây là cú pháp của việc thêm ràng buộc UNIQUE
vào bảng:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
UNIQUE(column1, column2,...);
Giả sử bạn có bảng hr.persons
sau :
CREATE TABLE hr.persons (
person_id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255),
phone VARCHAR(20),
);
Câu lệnh sau đây thêm ràng buộc UNIQUE
vào cột email
:
ALTER TABLE hr.persons
ADD CONSTRAINT unique_email UNIQUE(email);
Tương tự, câu lệnh sau thêm ràng buộc UNIQUE
vào cột phone
:
ALTER TABLE hr.persons
ADD CONSTRAINT unique_phone UNIQUE(phone);
Xóa các ràng buộc UNIQUE
Để tạo một ràng buộc UNIQUE
, bạn sử dụng câu lệnh ALTER TABLE DROP CONSTRAINT
như sau:
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
Câu lệnh sau xóa ràng buộc unique_phone
khỏi bảng hr.persons
:
ALTER TABLE hr.persons
DROP CONSTRAINT unique_phone;
Sửa đổi các ràng buộc UNIQUE
SQL Server không có bất kỳ câu lệnh trực tiếp nào để sửa đổi một ràng buộc UNIQUE
. Do đó, bạn cần phải xóa ràng buộc trước và tạo lại nó nếu bạn muốn thay đổi ràng buộc.
Trong hướng dẫn này, bạn đã học cách sử dụng ràng buộc UNIQUE
trong SQL Server để đảm bảo rằng dữ liệu chứa trong một cột hoặc một nhóm cột là duy nhất.