我有一个数据库,其中3个表具有FK关系,因为:
表A有2个(相关)字段:
TypeId(int)
LinkId(int)
表B和C每个都有一个主键,映射到表A中的LinkId。如果表A中的TypeId为1,则LinkId映射到表B中的主键。如果它是2,则映射到主键表C中的关键。
在这个设计糟糕的数据库中,无论如何都要强制这些表之间的参照完整性?即如果表B或C中不存在相应的记录,是否可以阻止SQL Server在表A中插入记录?
答案 0 :(得分:1)
您可以使用两个新的链接表,并从表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 )