Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hiểu rõ về các ràng buộc duy nhất của SQL Server

Ràng buộc khóa duy nhất là gì?

Ràng buộc duy nhất là một quy tắc hạn chế các mục nhập cột ở mức duy nhất. Nói cách khác, loại ràng buộc này ngăn chặn việc chèn các bản sao vào một cột. Ràng buộc duy nhất là một trong những công cụ để thực thi tính toàn vẹn của dữ liệu trong cơ sở dữ liệu SQL Server. Vì một bảng chỉ có thể có một khóa chính, bạn có thể sử dụng một ràng buộc duy nhất để thực thi tính duy nhất của một cột hoặc kết hợp các cột không tạo thành khóa chính.

Tạo một ràng buộc duy nhất trên một cột sẽ tự động tạo một chỉ mục duy nhất. Bằng cách này, SQL Server thực hiện yêu cầu toàn vẹn của ràng buộc duy nhất. Do đó, khi cố gắng chèn một giá trị trùng lặp vào một cột, có một ràng buộc duy nhất được xác định, Cơ sở dữ liệu sẽ phát hiện vi phạm ràng buộc duy nhất và đưa ra lỗi tương ứng. Do đó, hàng có các giá trị trùng lặp sẽ không được thêm vào bảng.

Tạo một ràng buộc duy nhất

Truy vấn mẫu sau đây tạo ra Sinh viên bảng và một ràng buộc duy nhất trên Đăng nhập để không có sinh viên nào có cùng thông tin đăng nhập.

CREATE TABLE Students (
Login CHAR NOT NULL
,CONSTRAINT AK_Student_Login UNIQUE (Login)
);
GO

Nếu Học sinh bảng đã tồn tại, thì bạn có thể sử dụng truy vấn mẫu sau để tạo ràng buộc duy nhất.

ALTER TABLE Students
ADD CONSTRAINT AK_Student_Login UNIQUE (Login);
GO

Lưu ý rằng khi bạn thêm một ràng buộc duy nhất vào một bảng hiện có, Công cụ Cơ sở dữ liệu sẽ xác minh xem cột mà ràng buộc được thêm vào có bao gồm các giá trị trùng lặp hay không. Nếu có các giá trị như vậy, ràng buộc sẽ không được thêm vào, trả về lỗi.

Bây giờ, để xác minh rằng ràng buộc duy nhất đã thực sự được thêm vào, hãy thực thi các câu lệnh sau:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

Đây là ràng buộc chúng tôi đã tạo:

Tạo một ràng buộc duy nhất trong SQL Server Management Studio

Giả sử chúng ta cần xác định một ràng buộc duy nhất đối với Đăng nhập cột nó là Học sinh bảng.

1. Trong Trình khám phá đối tượng , nhấp chuột phải vào Sinh viên bảng và nhấp vào Thiết kế .

2. Nhấp chuột phải vào Trình thiết kế bảng và chọn Chỉ mục / Khóa…

3. Trong Chỉ mục / Khóa cửa sổ, nhấp vào Thêm .

4. Trong Chung , nhấp vào Cột và sau đó nhấp vào nút dấu chấm lửng. Trong Cột chỉ mục cửa sổ, chọn (các) cột mà bạn muốn đưa vào ràng buộc duy nhất.

5. Trong Chung , nhấp vào Loại và chọn Khóa duy nhất từ danh sách thả xuống.

6. Trong Danh tính , chỉ định tên của ràng buộc (trong trường hợp của chúng tôi là AK_Student_Login ) và nhấp vào Đóng để lưu ràng buộc mới được tạo.

Bây giờ, nếu bạn truy cập Sinh viên bảng trong Trình khám phá đối tượng và nhấp vào Chỉ mục thư mục, bạn sẽ thấy rằng bảng chứa khóa chính và ràng buộc duy nhất AK_Student_Login .

Các ràng buộc duy nhất khác với khóa chính như thế nào?

Tương tự như một ràng buộc duy nhất, một khóa chính cũng được sử dụng để thực thi tính toàn vẹn của dữ liệu trong một bảng. Nhưng mục đích chính của khóa chính là xác định duy nhất từng bản ghi trong bảng và thực hiện các mối quan hệ thích hợp giữa các bảng trong cơ sở dữ liệu. Một khóa chính được yêu cầu trong 99% các bảng để cho phép truy cập thích hợp vào các hàng của bảng. Chỉ có thể có một khóa chính cho mỗi bảng được xác định trên một hoặc nhiều cột.

Các ràng buộc duy nhất được sử dụng đặc biệt để ngăn các giá trị trùng lặp được chèn vào một cột. Có thể có một số cột với các ràng buộc duy nhất hoặc có thể không có ràng buộc duy nhất nào được xác định trên một bảng. Chúng không bắt buộc đối với một bảng thay vì các khóa chính.

Giả sử, chúng tôi có Học sinh bảng chứa thông tin cá nhân về từng sinh viên tại một trường đại học. Bảng bao gồm StudentID là một khóa chính và lưu trữ một ID duy nhất của từng sinh viên cụ thể. Cột khóa chính này được sử dụng để xác định duy nhất từng sinh viên tại một trường đại học.

Đồng thời, các Học sinh bảng có các cột như Email , Số an sinh xã hội Đăng nhập và mỗi cột này phải lưu trữ các giá trị duy nhất. Vì đã có một khóa chính trong bảng, thay vào đó chúng tôi sẽ sử dụng các ràng buộc duy nhất để áp đặt tính duy nhất cho các cột này. Do đó, một bảng có thể có nhiều ràng buộc duy nhất và chỉ một khóa chính.

Một điều khác khác với một ràng buộc duy nhất so với khóa chính là khóa chính không cho phép bất kỳ NULL nào giá trị trong một cột, trong khi cột có ràng buộc duy nhất có thể bao gồm NULL nhưng chỉ một giá trị vì SQL Server diễn giải hai giá trị NULL là các giá trị giống nhau.

Giả sử một ràng buộc duy nhất được tạo trên Email cột của Học sinh bàn. Hãy thử chèn cả hai hàng bằng NULL s trong Email lĩnh vực:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')

GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')

GO

Chúng tôi nhận được thông báo lỗi sau:

Chà, đây là một hành vi có thể dự đoán được, bởi vì các giá trị trùng lặp, ngay cả khi chúng là NULL, không được phép bởi ràng buộc duy nhất.

Ràng buộc duy nhất so với Chỉ mục duy nhất

Mặc dù cả ràng buộc duy nhất và chỉ mục duy nhất đều là hai thực thể cơ sở dữ liệu không liên quan hoàn toàn khác nhau, chúng có cùng mục tiêu và tác động giống nhau đến hiệu suất của SQL Server. Cả hai đều đảm bảo tính duy nhất của dữ liệu trong một cột.

Tuy nhiên, ngược lại với chỉ mục duy nhất, bạn không thể chỉ định tùy chọn IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX và STATISTICS_NORECOMPUTE cho ràng buộc duy nhất trong các câu lệnh ALTER TABLE.

Khi bạn tạo một ràng buộc duy nhất trên một cột, SQL Server sẽ tự động tạo một chỉ mục duy nhất trên cột, đây chỉ là cách tính năng này được triển khai trong SQL Server.

Để xóa chỉ mục duy nhất, trước tiên bạn cần bỏ giới hạn duy nhất tương ứng và điều này sẽ tự động xóa chỉ mục duy nhất cơ bản.

Câu lệnh sau sẽ loại bỏ AK_Student_Login ràng buộc:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

Bạn có thể thấy rằng việc giảm AK_Student_Login ràng buộc duy nhất sẽ xóa chỉ mục tương ứng của nó.

Điều đó thật dễ dàng, bây giờ bạn có thể chèn các giá trị giống hệt nhau vào Đăng nhập cột.

Vô hiệu hóa Ràng buộc Duy nhất

Có một tùy chọn vô hiệu hóa một ràng buộc duy nhất. Truy vấn sau được cho là vô hiệu hóa tất cả các ràng buộc của bảng:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

Sau khi thực thi truy vấn, bây giờ hãy thử chèn một bản ghi trùng lặp:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')
GO

Những gì chúng tôi nhận được là thông báo vi phạm ràng buộc duy nhất:

Do đó, có vẻ như ALTER TABLE

NOCHECK CONSTRAINT ALL GO không hoạt động đối với các ràng buộc duy nhất trong SQL Server.

Tuy nhiên, hãy nhớ rằng có một chỉ mục duy nhất bên dưới mỗi ràng buộc duy nhất và chúng ta có thể vô hiệu hóa một chỉ mục duy nhất. Trong trường hợp của chúng tôi, AK_Student_Email ràng buộc duy nhất đã tạo AK_Student_Email tương ứng chỉ mục duy nhất trên Email cột. Hãy sử dụng truy vấn sau để tắt AK_Student_Email chỉ mục duy nhất đầu tiên.

ALTER INDEX AK_Student_Email ON Students
DISABLE;

Truy vấn đã hoàn tất thành công, vì vậy bây giờ hãy chèn hai bản ghi có Email trùng lặp các trường vào Học sinh bảng.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')
GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')
GO

Nó hoạt động! Các bản ghi đã được chèn vào bảng! Bây giờ chúng tôi biết cách giải quyết vấn đề "vô hiệu hóa" này với một ràng buộc duy nhất.

Để bật chỉ mục, hãy sử dụng truy vấn sau:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

Kết luận

Các ràng buộc khóa duy nhất cho phép các nhà phát triển DBA và SQL thực thi và duy trì tính duy nhất của dữ liệu trong các cột bảng, cũng như áp dụng các yêu cầu nghiệp vụ nhất định đối với tính toàn vẹn của dữ liệu. Về cơ bản, không có sự khác biệt đáng kể về hành vi giữa một ràng buộc duy nhất và một chỉ mục duy nhất, ngoại trừ thực tế là ràng buộc duy nhất không thể bị vô hiệu hóa trực tiếp và một số tùy chọn tạo chỉ mục nhất định không có sẵn cho các ràng buộc duy nhất trong câu lệnh ALTER TABLE.

Hy vọng bài viết này là thú vị. Bạn có thể đặt câu hỏi, để lại nhận xét và đề xuất liên quan đến bài viết này.

Xem thêm: Ràng buộc KIỂM TRA trong SQL Server


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để ngăn chặn SQL Server LocalDB tự động tắt?

  2. Áp dụng chéo truy vấn xml hoạt động kém hơn theo cấp số nhân khi tài liệu xml phát triển

  3. Loại SQL chính xác để lưu trữ .Net Timespan có giá trị> 24:00:00 là gì?

  4. Các hàm toán học của SQL Server (Danh sách đầy đủ)

  5. Giới thiệu về Lệnh GO trong SQL Server