首页 > 解决方案 > 如何确保依赖于值的引用完整性

问题描述

假设我有一张桌子Level1

Id int PK
Deleted bit

和另一个表Level2

Id int
Deleted bit
Level1id int

我可以添加一个FKtoLevel2来匹配Level1idwithLevel1.Id在确保父级存在方面效果很好。

但是,如果我想确保记录只能INSERTedLevel2匹配的记录Level1Deletedbit = 0 时出现怎么办?

此外,当任何子记录的bit = 0时,如何防止Deleted标志 in被设置 = 1 ?即所有子记录必须有= 1,然后父记录才能有= 1Level1Level2DeletedDeletedDeleted

我猜我可能不得不写一个触发器,但我希望有一个更优雅的解决方案......

标签: sqlsql-server

解决方案


您可以使用外键约束来执行此操作,但您需要添加更多信息。

首先是包含该位的唯一约束:

alter table level1 add constraint unq_level1_id, deleted
    unique (delete, id);

然后,添加一个常0数值level2

alter table level2 add (cast(0 as bit)) as deleted_0 persisted;

然后,添加外键约束:

alter table level2 add constraint fk_level2_id_deleted
    foreign key (level1id, deleted) references table1(id, deleted);

推荐阅读