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

Thêm ràng buộc KIỂM TRA vào một bảng hiện có trong SQL Server (T-SQL)

Bài viết này trình bày cách thêm CHECK ràng buộc vào một bảng hiện có.

Bạn có thể thêm một ràng buộc vào bảng hiện có bằng cách sử dụng ALTER TABLE cùng với ADD CONSTRAINT lý lẽ. Ví dụ bên dưới.

Ví dụ 1 - Tạo bảng

Đầu tiên, hãy tạo một bảng mà chúng ta sẽ thêm CHECK ràng buộc.

CREATE TABLE Event
(
  EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  EventName varchar(255) NOT NULL,
  StartDate date NOT NULL,
  EndDate date NOT NULL,
  Price smallmoney NOT NULL
);

Ví dụ 2 - Thêm Ràng buộc Cấp độ Cột

Bây giờ chúng ta hãy thêm một CHECK ràng buộc đối với Giá cột.

ALTER TABLE Event
  ADD CONSTRAINT chkPrice CHECK (Price > 0);

Ràng buộc này sẽ đảm bảo rằng giá luôn lớn hơn 0.

Giờ đây, ràng buộc đã được thêm vào, đây là điều sẽ xảy ra nếu chúng tôi cố gắng chèn dữ liệu không hợp lệ:

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );

Kết quả:

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.

Trong trường hợp này, CHECK ràng buộc chỉ định rằng tất cả dữ liệu trong Price cột phải lớn hơn 0. Nói cách khác, giá không được bằng 0 và không được âm.

Đây được gọi là ràng buộc cấp cột , bởi vì nó được xác định trên một cột duy nhất. Nó áp dụng cho dữ liệu trong một cột.

Ví dụ 3 - Thêm Ràng buộc Cấp Bảng

Bây giờ, hãy thêm một CHECK cấp bảng hạn chế. Thao tác này sẽ kiểm tra dữ liệu trong hai cột.

ALTER TABLE Event
  ADD CONSTRAINT chkEndDate 
  CHECK (EndDate >= StartDate);

Trong trường hợp này, tôi thêm một ràng buộc để đảm bảo rằng ngày kết thúc không bao giờ có thể sớm hơn ngày bắt đầu. Đây là kiểm tra dữ liệu trên hai cột và do đó là một ràng buộc cấp bảng.

Cố gắng chèn một giá trị không hợp lệ:

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );

Kết quả:

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".

Như mong đợi, hoạt động không thành công vì ngày kết thúc của tôi sớm hơn ngày bắt đầu.

Lưu ý rằng để kiểm tra ràng buộc này, tôi phải tăng giá lên một giá trị hợp lệ để ngăn ràng buộc trước đó được kích hoạt trước (CHECK các ràng buộc được xác thực theo thứ tự chúng được tạo).

Ví dụ 4 - Chèn thành công dữ liệu phù hợp với ràng buộc

Để chèn hàng thành công, tất cả những gì chúng ta cần làm là đảm bảo rằng chúng ta đang chèn các giá trị hợp lệ.

Ví dụ:

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 );

SELECT * FROM Event;

Kết quả:

+-----------+-------------+-------------+------------+----------+
| EventId   | EventName   | StartDate   | EndDate    | Price    |
|-----------+-------------+-------------+------------+----------|
| 4         | ICCC 2020   | 2020-01-01  | 2020-02-02 | 150.0000 |
+-----------+-------------+-------------+------------+----------+

Lưu ý rằng EventId cột đã tăng lên 4. Điều này là do nó là IDENTITY cột. Một điều quan trọng cần nhớ về IDENTITY là chúng tăng lên ngay cả khi một ràng buộc gây ra INSERT hoạt động không thành công.

Một số hạn chế của Ràng buộc CHECK

Dưới đây là một số hạn chế cần lưu ý khi làm việc với CHECK ràng buộc:

  • Điều kiện tìm kiếm phải đánh giá thành biểu thức Boolean và không thể tham chiếu đến bảng khác.
  • Biểu thức không được chứa các kiểu dữ liệu bí danh.
  • CHECK không thể xác định ràng buộc trên văn bản , ntext hoặc hình ảnh cột.

  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ách trả lại các khóa trùng lặp từ tài liệu JSON trong SQL Server

  2. Khóa chính tự động tăng dần trong SQL Server Management Studio 2012

  3. Cách lấy Bản ghi riêng biệt từ một bảng trong SQL Server - Hướng dẫn sử dụng SQL Server / TSQL 112

  4. Tại sao kết nối ODBC của tôi không thành công khi chạy tải SSIS trong Visual Studio nhưng không phải khi chạy cùng một gói sử dụng Tiện ích gói thực thi

  5. Bạn có thể gọi một dịch vụ web từ mã TSQL không?