sql - 如何确保依赖于值的引用完整性
问题描述
假设我有一张桌子Level1
:
Id int PK
Deleted bit
和另一个表Level2
:
Id int
Deleted bit
Level1id int
我可以添加一个FK
toLevel2
来匹配Level1id
withLevel1.Id
在确保父级存在方面效果很好。
但是,如果我想确保记录只能INSERTed
在Level2
匹配的记录Level1
有Deleted
bit = 0 时出现怎么办?
此外,当任何子记录的bit = 0时,如何防止Deleted
标志 in被设置 = 1 ?即所有子记录必须有= 1,然后父记录才能有= 1Level1
Level2
Deleted
Deleted
Deleted
我猜我可能不得不写一个触发器,但我希望有一个更优雅的解决方案......
解决方案
您可以使用外键约束来执行此操作,但您需要添加更多信息。
首先是包含该位的唯一约束:
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);
推荐阅读
- accessibility - Catalyst 'SwiftUI.AccessibilityNode' 不是已知的可序列化元素
- amazon-web-services - 无法将公共弹性 IP 绑定到运行 Windows Server 2016 的 EC2 上的弹性搜索
- c# - 如何制作通用平均方法,以便您可以将任何类型放入其中?
- mysql - 从多个来源将数据插入mysql
- android - 有没有办法知道 WorkManager 作业是否因为约束而没有执行?
- reactjs - 当您使用 React-hooks 时,我们应该在 Redux 哪里进行异步 Api 调用?
- json - 从 Angular 应用程序中的 JSON 文件读取应用程序设置
- django-models - 两个依赖模型如何在 django-model 中连接在一起,因此我可以从这两个模型中提取所有数据?
- asp.net-core - 登录 Identity Server 4 - .Net Core 2.2
- c - 如何阅读这种格式