为列值创建条件规则

Ski*_*eak 1 sql-server constraint

我目前正在 SQL Server 中处理下表

Table: order_status_logs
    log_id      INT NOT NULL IDENTITY(1,1)
    order_id    INT NOT NULL
    status_id   INT NOT NULL
    log_date    DATE NOT NULL
    expected_by DATE NULL
Run Code Online (Sandbox Code Playgroud)

在此status_id列的表中,可能有以下值:

[1] - Pending
[2] - Ordered
[3] - Backordered
[4] - Received
Run Code Online (Sandbox Code Playgroud)

我想设置我的表,以便在尝试创建新记录时,如果不等于 4 ,expected_by则从NULL到 。基本上除非已收到订单,否则该表将始终需要该列的数据。NOT NULLstatus_idexpected_by

可以用 a 来做到这一点CONSTRAINT吗?或者这是我需要通过返回错误消息的程序或如果我不提供该列数据的内容来执行的操作?

AMG*_*AMG 5

是的,您可以在不使用触发器或存储过程的情况下创建表检查约束。这对 Sql Server 2008 或更高版本有效:

ALTER TABLE dbo.order_status_logs
   ADD 
   CONSTRAINT CHK_EXPECTED_BY   
   CHECK ((status_id <> 4 AND expected_by IS NOT NULL) OR status_id = 4);  
GO  
Run Code Online (Sandbox Code Playgroud)