与条件的外键关系

时间:2015-05-04 04:15:17

标签: sql-server constraints relationship

早上好,

我有一个带有ID和类型的主表。根据类型,我有子表使用此ID作为外键以确保完整性。 例如。对于主表:

master_ID, type
11, A
12, B
13, A

对于名为Child_A的子表,它存储类型A的其他数据;

Child_A_ID, FK_master_ID, ....
1, 11, ....
2, 13, ....

如果我的子表中有相应的记录,如何防止主表中的类型更改为其他值。我的参照完整性目前保留,但没有意义存储在A类的Child_A信息中,而主表中的记录属于不同类型。

编辑:

具有2个属性(ID和类型)的外键并在每个子表中重复类型是唯一的解决方案吗? 例如。对于child_A表;

Child_A_ID, FK_master_ID, type, ....
1, 11, A, ....
2, 13, A, ....

希望它足够清楚。

西尔

1 个答案:

答案 0 :(得分:1)

您可以创建使用check constraintuser defined function来确定相关类型表中是否包含id值。

ALTER TABLE MasterTable
  ADD CONSTRAINT CHK_MasterTable_Type
  CHECK(dbo.fn_check_IdBelongsToType(master_ID, type) = 1)

在函数本身中你会做这样的事情:

CREATE FUNCTION fn_check_IdBelongsToType (
    @master_ID int, 
    @type char(1)
)
RETURNS int
AS
BEGIN
   IF @Type = 'A' AND EXISTS (
       SELECT 1
       FROM Child_A
       WHERE FK_master_ID = @master_ID 
   ) RETURN 1

   IF @Type = 'B' AND EXISTS (
       SELECT 1
       FROM Child_B
       WHERE FK_master_ID = @master_ID 
   ) RETURN 1

   IF @Type = 'C' AND EXISTS (
       SELECT 1
       FROM Child_C
       WHERE FK_master_ID = @master_ID 
   ) RETURN 1

   -- after testing all child tables, return 0 to indicate that the value was not found
   RETURN 0

END