针对两个表的SQL Server外键关系

时间:2012-05-06 17:38:46

标签: sql-server referential-integrity

我有一个数据库,其中3个表具有FK关系,因为:

表A有2个(相关)字段:
TypeId(int)
LinkId(int)

表B和C每个都有一个主键,映射到表A中的LinkId。如果表A中的TypeId为1,则LinkId映射到表B中的主键。如果它是2,则映射到主键表C中的关键。

在这个设计糟糕的数据库中,无论如何都要强制这些表之间的参照完整性?即如果表B或C中不存在相应的记录,是否可以阻止SQL Server在表A中插入记录?

1 个答案:

答案 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 )