我有一个数据库,其中 3 个表具有 FK 关系,因为:
表 A 有 2 个(相关)字段:
TypeId (int)
LinkId (int)
表 B 和 C 各有一个主键映射到表 A 中的 LinkId。如果表 A 中的 TypeId 为 1,则 LinkId 映射到表 B 中的主键。如果为 2,则映射到表中的主键C。
在这个设计糟糕的数据库中,无论如何都要在这些表之间强制执行参照完整性?即如果表B或C中不存在相应的记录,是否可以阻止SQL Server在表A中插入记录?
我有一个数据库,其中 3 个表具有 FK 关系,因为:
表 A 有 2 个(相关)字段:
TypeId (int)
LinkId (int)
表 B 和 C 各有一个主键映射到表 A 中的 LinkId。如果表 A 中的 TypeId 为 1,则 LinkId 映射到表 B 中的主键。如果为 2,则映射到表中的主键C。
在这个设计糟糕的数据库中,无论如何都要在这些表之间强制执行参照完整性?即如果表B或C中不存在相应的记录,是否可以阻止SQL Server在表A中插入记录?
LinkId
您可以使用两个新的链接表并从表中删除A
AB (Aid, Bid)
AC (Aid, Cid)
不过取决于您的应用程序以及您对插入的控制...
您不必使用内置约束 - 如果您想保留该结构,当然可以编写带有触发器的自定义约束。
就像是:
CREATE TRIGGER trigger_name ON A
FOR INSERT, UPDATE
AS
declare @err varchar(50)
select @err = case
when inserted.typeid = 1 and not exists(select 0 from B where id=inserted.linkid) then
@err = 'No link record exists in B.'
when inserted.typeid = 2 and not exists(select 0 from C where id=inserted.linkid) then
@err = 'No link record exists in C.'
else @err = null
end
from inserted
if @err is not null RAISERROR (@err, 16, 1 )