SQL 检查另一个 table 列的值的约束

SQL Constraint to check the value of another table's column

假设我有 2 个 table,EmployeeSale

Employee table 有 EMP_ID int 作为 PK,和 ACTIVE_STATUS 位(0 表示不活动,1 表示活动)。 Sale table 有 SALE_ID 作为 PK,EMP_ID 作为 FK 引用 Employee.EMP_IDDATE_OF_SALE

现在,我想要一个约束来检查我试图插入到 Sale 中的 EMP_ID 对于 [=12] 中的 ACTIVE 列是否具有值 1 =] table,因为我不想注册非活跃用户正在尝试的销售。

我该怎么做?我试过 CONSTRAINT CHECK_IF_ACTIVE CHECK(Employee.ACTIVE = 1) 但它不是一个有效的声明。

您可以使用外键和计算列来执行您特别要求的操作。首先,在employees:

中定义一个冗余的唯一约束
alter table employees add constraint unq_employees_empid_active_status on (empid, active_status);

然后,在sales中定义一个计算列。唉,这个需要坚持,我觉得:

alter table sales add active_status as (convert(bit, 1)) persisted;

然后,使用两者定义外键约束:

alter table sales add foreign key fk_sales_employees_active
    foreign key (empid, active_status) references employees(empid, active_status);

瞧!员工id只能引用在职员工。

现在,您将遇到问题 -- 请注意您的要求。这不是你真正想要的。这会在所有时间 上强制执行约束。因此,您将无法更改有销售的员工的状态。这表明您需要一个插入触发器,或者一个用户定义的函数和 check 约束:

create function is_employee_active (
    @empid int
) returns bit as
begin
    return (select active_status from employees e where e.empid = @empid);
end;

alter table sales add constraint chk_sales_employee_active
    check (is_employee_active(empid) = convert(bit, 1));

瞧!这只会检查插入或更新。请注意,一旦员工不活跃,您也将无法更新该行。

您会注意到我通常用复数命名我的表,因为它们包含实体的大量示例。当我想到表格时,我的手指只会加上“s”。