0

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

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

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

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

4

1 回答 1

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 )
于 2012-05-06T17:44:21.153 回答