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

Cách tạo Ràng buộc Kiểm tra trên Nhiều Cột trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 84

Tình huống:

Bạn đang làm việc với tư cách là nhà phát triển SQL Server, bạn cần tạo bảng dbo.Customer phải có các cột Tên, Tuổi và Kiểu tuổi. Bạn có thể thêm CustomerId làm Identity. Bạn cần tạo Ràng buộc Kiểm tra trên Cột Độ tuổi và Loại Tuổi với lôgic bên dưới


<65 agetype ="Adult" và ="" p ="">
Nếu đúng thì hãy để bản ghi chèn hoặc cập nhật không thành công do Kiểm tra Ràng buộc.

<65 agetype ="Adult" and ="" p =""> Giải pháp:

<65 agetype ="Adult" and ="" p =""> Tập lệnh dưới đây có thể được sử dụng để thêm Kiểm tra Ràng buộc trên nhiều cột theo yêu cầu của chúng tôi.


CREATE TABLE dbo.Customer (
    CustomerId INT identity(1, 1)
    ,NAME VARCHAR(100)
    ,Age INT
    ,AgeType VARCHAR(15)
    ,CONSTRAINT dbo_Customer_AgeAndAgeType CHECK (
        (
            Age <= 17
            AND AgeType = 'Child'
            )
        OR (
            Age > 17
            AND Age < 65
            AND AgeType = 'Adult'
            )
        OR (
            Age >= 65
            AND AgeType = 'Senior'
            )
        )
    )
 
 
Hãy chèn một vài bản ghi và thử xem Kiểm tra Ràng buộc có hoạt động như mong đợi hay không.


 
--Correct values accrording to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Najaf',13,'Child')
go

--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Leena',14,'Adult')
go
--Correct values accroding to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Raza',30,'Adult')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Aamir',30,'Senior')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('John',65,'Adult')
go
--Correct values accroding to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Kris',65,'Senior')
go


(1 (các) hàng bị ảnh hưởng)
Bản tin 547, Mức 16, Trạng thái 0, Dòng 25
Câu lệnh INSERT xung đột với ràng buộc CHECK "dbo_Customer_AgeAndAgeType". Xung đột đã xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer".
Câu lệnh đã bị chấm dứt.

(1 (các) hàng bị ảnh hưởng)
Msg 547, Cấp 16, Trạng thái 0, Dòng 33
Câu lệnh INSERT xung đột với ràng buộc CHECK "dbo_Customer_AgeAndAgeType". Xung đột đã xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer".
Câu lệnh đã bị chấm dứt.
Msg 547, Mức 16, Trạng thái 0, Dòng 37
Câu lệnh INSERT xung đột với ràng buộc CHECK "dbo_Customer_AgeAndAgeType". Xung đột đã xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer".
Câu lệnh đã bị chấm dứt.

(1 (các) hàng bị ảnh hưởng)

Hãy kiểm tra dữ liệu trong bảng bằng cách sử dụng truy vấn chọn. Như có thể thấy bên dưới, các bản ghi duy nhất được chèn đã vượt qua Ràng buộc Kiểm tra. Không thể chèn phần còn lại của bản ghi.
Cách tạo Kiểm tra Ràng buộc trên Nhiều Cột trong Bảng SQL Server

Hãy thử cập nhật các bản ghi và xem Kiểm tra Ràng buộc có hoạt động như mong đợi hay không.

update dbo.Customer
set Age=30
where Customerid=1


Nó không thành công với lỗi bên dưới vì chúng tôi không thể có Tuổi 30 cho AgeType ='Child' theo logic Kiểm tra Ràng buộc của chúng tôi.

Msg 547, Cấp 16, Trạng thái 0, Dòng 18
Câu lệnh UPDATE xung đột với ràng buộc CHECK "dbo_Customer_AgeAndAgeType". Xung đột xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer".
Câu lệnh đã bị chấm dứt.


Video Demo:Cách tạo Kiểm tra Ràng buộc trên Nhiều cột 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. Sử dụng RegEx trong SQL Server

  2. varbinary thành chuỗi trên SQL Server

  3. Làm cách nào để lấy Thời gian từ định dạng DateTime trong SQL?

  4. SQL Server UNION - ORDER BY Behavior mặc định là gì

  5. Ví dụ về DATENAME () trong SQL Server