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

Khám phá các ràng buộc khác nhau trong SQL Server

Ràng buộc trong SQL Server là các quy tắc được xác định trước mà bạn có thể thực thi trên một hoặc nhiều cột. Các ràng buộc này giúp duy trì tính toàn vẹn, độ tin cậy và độ chính xác của các giá trị được lưu trữ trong các cột này. Bạn có thể tạo các ràng buộc bằng cách sử dụng câu lệnh CREATE TABLE hoặc ALTER Table. Nếu bạn sử dụng câu lệnh ALTER TABLE, SQL Server sẽ kiểm tra dữ liệu cột hiện có trước khi tạo ràng buộc.

Nếu bạn chèn dữ liệu trong cột đáp ứng tiêu chí quy tắc ràng buộc, SQL Server sẽ chèn dữ liệu thành công. Tuy nhiên, nếu dữ liệu vi phạm ràng buộc, câu lệnh chèn sẽ bị hủy bỏ với thông báo lỗi.

Ví dụ:hãy xem xét rằng bạn có một bảng [Nhân viên] lưu trữ dữ liệu nhân viên trong tổ chức của bạn, bao gồm cả tiền lương của họ. Có một số quy tắc cơ bản khi nói đến các giá trị trong cột lương.

  • Cột không được có các giá trị âm, chẳng hạn như -10.000 hoặc -15.000 USD.
  • Bạn cũng muốn chỉ định giá trị tiền lương tối đa. Ví dụ:mức lương tối đa phải dưới 2.000.000 USD.

Nếu bạn chèn một bản ghi mới với một ràng buộc tại chỗ, SQL Server sẽ xác thực giá trị theo các quy tắc đã xác định.

Giá trị đã chèn:

Lương 80.000:Đã chèn thành công

Mức lương -50.000: Lỗi

Chúng ta sẽ khám phá các ràng buộc sau trong SQL Server trong bài viết này.

  • KHÔNG ĐẦY ĐỦ
  • ĐỘC ĐÁO
  • KIỂM TRA
  • TỪ KHÓA CHÍNH
  • TỪ KHÓA NGOẠI TỆ
  • DEFAULT

Ràng buộc KHÔNG ĐẦY ĐỦ

Theo mặc định, SQL Server cho phép lưu trữ các giá trị NULL trong các cột. Các giá trị NULL này không đại diện cho dữ liệu hợp lệ.

Ví dụ:mọi nhân viên trong một tổ chức phải có Emp ID, tên, giới tính và địa chỉ. Do đó, bạn có thể chỉ định một cột có ràng buộc NOT NULL để luôn đảm bảo các giá trị hợp lệ.

Tập lệnh CREATE TABLE bên dưới xác định các ràng buộc NOT NULL cho các cột [ID], [FirstName], [LastName], [Gender] và [Address].

CREATE TABLE Employees
(
ID INT NOT NULL,
[FirstName] Varchar(100) NOT NULL,
[MiddleName] Varchar(50) NULL,
[LastName] Varchar(100) NOT NULL,
[Gender] char(1) NOT NULL,
[Address] Varchar(200) NOT NULL
)

Để xác thực hành vi, ràng buộc NOT NULL, chúng tôi sử dụng các câu lệnh INSERT sau.

  • Chèn giá trị cho tất cả các cột (NULL và NOT NULL) - Chèn thành công
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
  • Chèn giá trị cho các cột có thuộc tính NOT NULL - Chèn thành công
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2,
'Shyam','Agarwal','M','UK')
  • Bỏ qua việc chèn giá trị cho cột [LastName] có ràng buộc KHÔNG ĐẦY ĐỦ - Không đạt +
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')

Câu lệnh INSERT cuối cùng đã gây ra lỗi - Không thể chèn giá trị NULL vào cột .

Bảng này có các giá trị sau được chèn vào bảng [Nhân viên].

Giả sử rằng chúng tôi không yêu cầu giá trị NULL trong cột [MiddleName] theo yêu cầu của HR. Với mục đích này, bạn có thể sử dụng câu lệnh ALTER TABLE.

ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Câu lệnh ALTER TABLE này không thành công do các giá trị hiện có của cột [MiddleName]. Để thực thi ràng buộc, bạn cần loại bỏ các giá trị NULL này rồi chạy câu lệnh ALTER.

UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL
Go
ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Bạn cũng có thể xác thực các ràng buộc NOT NULL bằng cách sử dụng trình thiết kế bảng SSMS.

Ràng buộc DUY NHẤT

Ràng buộc DUY NHẤT trong SQL Server đảm bảo rằng bạn không có các giá trị trùng lặp trong một cột hoặc kết hợp các cột. Các cột này phải là một phần của các ràng buộc DUY NHẤT. SQL Server tự động tạo chỉ mục khi các ràng buộc UNIQUE được xác định. Bạn chỉ có thể có một giá trị duy nhất trong cột (bao gồm cả NULL).

Ví dụ:tạo [DemoTable] với cột [ID] có ràng buộc DUY NHẤT.

CREATE TABLE DemoTable
(
[ID] INT UNIQUE NOT NULL,
[EmpName] VARCHAR(50) NOT NULL
)

Sau đó, mở rộng bảng trong SSMS và bạn có một chỉ mục duy nhất (Không phân cụm), như được hiển thị bên dưới.

Vui lòng nhấp chuột phải vào chỉ mục và tạo tập lệnh của nó. Như hình dưới đây, nó sử dụng từ khóa ADD UNIQUE NONCLUSTERED cho ràng buộc.

Câu lệnh insert sau đây mắc lỗi vì nó cố gắng chèn các giá trị trùng lặp.

INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO

Ràng buộc KIỂM TRA

Ràng buộc CHECK trong SQL Server xác định một phạm vi giá trị hợp lệ có thể được chèn vào các cột đã chỉ định. Nó đánh giá từng giá trị được chèn hoặc sửa đổi và nếu nó được thỏa mãn, câu lệnh SQL được hoàn thành thành công.

Tập lệnh SQL sau đặt một ràng buộc cho cột [Tuổi]. Giá trị của nó phải lớn hơn 18 năm.

CREATE TABLE DemoCheckConstraint
(
ID INT PRIMARY KEY,
[EmpName] VARCHAR(50) NULL,
[Age] INT CHECK (Age>18)
)
GO

Hãy chèn hai bản ghi vào bảng này. Truy vấn chèn bản ghi đầu tiên thành công.

INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20)
Go
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17)
GO

Câu lệnh INSERT thứ hai không thành công vì nó không thỏa mãn điều kiện ràng buộc CHECK.

Một trường hợp sử dụng khác cho ràng buộc CHECK là lưu trữ các giá trị hợp lệ của mã Zip. Trong tập lệnh bên dưới, chúng tôi thêm một cột mới [Mã ZipCode] và cột này sử dụng ràng buộc CHECK để xác thực các giá trị.

ALTER TABLE DemoCheckConstraint ADD zipcode int
GO
ALTER TABLE DemoCheckConstraint
ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))

Ràng buộc KIỂM TRA này không cho phép mã Zip không hợp lệ. Ví dụ:câu lệnh INSERT thứ hai tạo ra lỗi.

INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203)
Go
INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)

Ràng buộc KHÓA CHÍNH

Ràng buộc PRIMARY KEY trong SQL Server là lựa chọn phổ biến giữa các chuyên gia cơ sở dữ liệu để triển khai các giá trị duy nhất trong bảng quan hệ. Nó kết hợp các ràng buộc UNIQUE và NOT NULL. SQL Server tự động tạo chỉ mục theo cụm khi chúng tôi xác định ràng buộc CHÍNH CHÍNH. Bạn có thể sử dụng một cột duy nhất hoặc một tập hợp các kết hợp để xác định các giá trị duy nhất trong một hàng.

Mục đích chính của nó là thực thi tính toàn vẹn của bảng bằng cách sử dụng giá trị cột hoặc thực thể duy nhất.

Nó tương tự như ràng buộc UNIQUE với những điểm khác biệt sau.

TỪ KHÓA CHÍNH TỪ KHÓA DUY NHẤT
Nó sử dụng một mã định danh duy nhất cho mỗi hàng trong bảng. Nó xác định duy nhất các giá trị trong một cột bảng.
Bạn không thể chèn giá trị NULL vào cột CHÍNH CHÍNH. Nó có thể chấp nhận một giá trị NULL trong cột khóa duy nhất.
Một bảng chỉ có thể có một ràng buộc CHÍNH CHÍNH. Bạn có thể tạo nhiều ràng buộc KEY DUY NHẤT trong SQL Server.
Theo mặc định, nó tạo chỉ mục theo nhóm cho các cột CHÍNH CHÍNH. KHÓA DUY NHẤT tạo chỉ mục không phân cụm cho các cột khóa chính.

Tập lệnh sau xác định KHÓA CHÍNH trên cột ID.

CREATE TABLE PrimaryKeyDemo
(
ID INT PRIMARY KEY,
[Name] VARCHAR(100) NULL
)

Như được hiển thị bên dưới, bạn có một chỉ mục khóa được nhóm lại sau khi xác định KHÓA CHÍNH trên cột ID.

Hãy chèn các bản ghi vào bảng [PrimaryKeyDemo] bằng các câu lệnh INSERT sau.

INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj')
GO
INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan')
GO

Bạn gặp lỗi trong câu lệnh INSERT thứ hai vì nó cố gắng chèn giá trị NULL.

Tương tự, nếu bạn cố gắng chèn các giá trị trùng lặp, bạn sẽ nhận được thông báo lỗi sau.

Ràng buộc NGOẠI KHÓA

Ràng buộc NGOẠI KHÓA trong SQL Server tạo mối quan hệ giữa hai bảng. Mối quan hệ này được gọi là mối quan hệ cha mẹ - con cái. Nó thực thi tính toàn vẹn tham chiếu trong SQL Server.

Khóa ngoại của bảng con phải có một mục nhập tương ứng trong cột khóa chính mẹ. Bạn không thể chèn các giá trị trong bảng con mà không chèn nó vào bảng mẹ trước. Tương tự, trước tiên, chúng ta cần xóa giá trị khỏi bảng con trước khi nó có thể bị xóa khỏi bảng mẹ.

Vì chúng ta không thể có các giá trị trùng lặp trong ràng buộc PRIMARY KEY, nó cũng không cho phép trùng lặp hoặc NULL trong bảng con.

Tập lệnh SQL sau tạo bảng cha có khóa chính và bảng con có tham chiếu khóa chính và khóa ngoại đến cột bảng cha [EmpID].

CREATE TABLE ParentTable
(
[EmpID] INT PRIMARY KEY,
[Name] VARCHAR(50) NULL
)
GO
CREATE TABLE ChildTable
(
[ID] INT PRIMARY KEY,
[EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID)
)

Chèn bản ghi trong cả hai bảng. Lưu ý rằng giá trị khóa ngoại của bảng con có một mục nhập trong bảng mẹ.

INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal')
INSERT INTO ChildTable VALUES (101,1),(102,2)

Nếu bạn cố gắng chèn một bản ghi trực tiếp vào bảng con không tham chiếu đến khóa chính của bảng mẹ, bạn sẽ nhận được thông báo lỗi sau.

Ràng buộc DEFAULT

Ràng buộc DEFAULT trong SQL Server cung cấp giá trị mặc định cho một cột. Nếu chúng tôi không chỉ định một giá trị trong câu lệnh INSERT cho cột có ràng buộc DEFAULT, thì SQL Server sẽ sử dụng giá trị được gán mặc định của nó. Ví dụ:giả sử một bảng đặt hàng có các bản ghi cho tất cả các đơn đặt hàng của khách hàng. Bạn có thể sử dụng hàm GETDATE () để nắm bắt ngày đặt hàng mà không cần chỉ định bất kỳ giá trị rõ ràng nào.

CREATE TABLE Orders
(
[OrderID] INT PRIMARY KEY,
[OrderDate] DATETIME NOT NULL DEFAULT GETDATE()
)
GO

Để chèn các bản ghi trong bảng này, chúng ta có thể bỏ qua việc gán giá trị cho cột [Ngày đặt hàng].

INSERT INTO Orders([OrderID]) values (1)
GO

CHỌN * TỪ Đơn đặt hàng

Sau khi cột ràng buộc DEFAULT chỉ định một giá trị rõ ràng, SQL Server sẽ lưu trữ giá trị rõ ràng này thay vì giá trị mặc định.

Ràng buộc lợi ích

Các ràng buộc trong SQL Server có thể có lợi trong các trường hợp sau:

  • Thực thi logic nghiệp vụ
  • Thực thi tính toàn vẹn của tham chiếu
  • Ngăn lưu trữ dữ liệu không phù hợp trong bảng SQL Server
  • Tăng cường tính duy nhất cho dữ liệu cột
  • Cải thiện hiệu suất truy vấn vì trình tối ưu hóa truy vấn nhận biết được dữ liệu duy nhất và xác thực các bộ giá trị
  • Ngăn lưu trữ các giá trị NULL trong bảng SQL
  • Viết mã để tránh NULL khi hiển thị dữ liệu trong ứng dụng

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cú pháp không chính xác gần từ khóa 'with' ... câu lệnh trước đó phải được kết thúc bằng dấu chấm phẩy

  2. Hàm tách tương đương trong T-SQL?

  3. Giá trị hiệu suất của COMB guids

  4. Thoát một chuỗi trong SQL Server để an toàn khi sử dụng trong biểu thức LIKE

  5. Giám sát cơ sở dữ liệu và phiên bản thông qua Activity Monitor | Khắc phục sự cố hiệu suất máy chủ SQL -2