我的数据库(TableA)中有一个表(TableA.Column1),它只允许来自另一个表(TableB.Column2)的某些行的值。这与正常的外键关系非常相似,除了只允许TableB.Column2中的某些行。例如,我可能只允许来自TableB.Column2的行,其中TableB.Column3> 100;
有没有办法在数据库中表达这种类型的引用完整性?我已经尝试将where子句添加到外键中,并且我尝试将子查询添加到Check约束。我还没去上班。
有人有任何建议吗?
答案 0 :(得分:3)
答案可能因您使用的数据库系统而异。但是选择肯定是使用触发器。
答案 1 :(得分:1)
如果您只允许表A中列中保存的“某些”值,则可以在表B中创建复合FK,然后在表中添加单独的检查约束(表B)?虽然,这听起来像我将在应用程序层中强制执行的事情。
答案 2 :(得分:1)
不,我认为没有办法做到这一点。
在这种情况下我通常最终会做的是在引用的表中创建一个“虚拟”条目(例如ID = -1, Text = "state or entry unknown"
之类的东西),然后将这些TableB.Column2
值设置为此虚拟ID值。
答案 3 :(得分:0)
从数据库的角度来看,触发器似乎是最好的答案......虽然根据您的设置,这种情况可能更容易在应用程序层上实施。什么是在这个表中插入行,是否可以对正在插入的内容而不是直接在数据库本身上强制执行此约束?以这种方式执行此操作确实存在一些风险,但根据您的设置可能会更简单