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','j.doe@bike.stores');

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','j.doe@bike.stores');

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 (j.doe@bike.stores).

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 UNIQUEPRIMARY 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 emailNULL:

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_idskill_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.

SQL Server
Bài Viết Liên Quan:
Sequence trong SQL Server
Trung Nguyen 31/07/2021
Sequence trong SQL Server

Trong hướng dẫn này, bạn sẽ tìm hiểu về các đối tượng Sequence trong SQL Server để tạo ra một chuỗi các giá trị số dựa trên một đặc tả cụ thể.

Cột Identity trong SQL Server
Trung Nguyen 30/07/2021
Cột Identity trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng thuộc tính IDENTITY trong SQL Server để thêm cột định danh vào bảng.

CREATE TABLE trong SQL Server
Trung Nguyen 29/07/2021
CREATE TABLE trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng câu lệnh CREATE TABLE trong SQL Server để tạo một bảng mới.

Ràng buộc NOT NULL trong SQL Server
Trung Nguyen 28/07/2021
Ràng buộc NOT NULL trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng ràng buộc NOT NULL trong SQL Server để đảm bảo một cột không chứa dữ liệu NULL.