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.