SQL中复杂的外键约束

时间:2011-05-10 17:29:19

标签: sql sql-server-2005 tsql foreign-keys constraints

有没有办法使用SQL Server 2005定义约束,不仅可以确保外键存在于另一个表中,还符合某个条件?

例如,假设我有两张桌子:

Table A
--------
Id - int
FK_BId - int

Table B
--------
Id - int
Name - string
SomeBoolean - bit

我可以定义一个约束,说明FK_BId必须指向表B中的记录,并且表B中的记录必须具有SomeBoolean = true?提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:4)

您可以使用(Id, SomeBoolean)上的复合键强制执行业务规则,在ACHECK中使用FK_BSomeBoolean约束,以确保它始终为TRUE。顺便说一下,我建议避免BIT,而是使用CHAR(1)进行域名检查,例如

CHECK (SomeBoolean IN ('F', 'T'))

表结构可能如下所示:

CREATE TABLE B
(
 Id INTEGER NOT NULL UNIQUE, -- candidate key 1
 Name VARCHAR(20) NOT NULL UNIQUE,  -- candidate key 2
 SomeBoolean CHAR(1) DEFAULT 'F' NOT NULL
    CHECK (SomeBoolean IN ('F', 'T')), 
 UNIQUE (Id, SomeBoolean) -- superkey
); 

CREATE TABLE A 
(
 Ib INTEGER NOT NULL UNIQUE, 
 FK_BId CHAR(1) NOT NULL, 
 FK_BSomeBoolean CHAR(1) DEFAULT 'T' NOT NULL
    CHECK (FK_BSomeBoolean = 'T')
 FOREIGN KEY (FK_BId, FK_BSomeBoolean)
    REFERENCES B (Id, SomeBoolean)
);

答案 1 :(得分:2)

我认为您所寻找的内容超出了外键的范围,但您可以执行检入触发器,存储过程或代码。

如果有可能,我会说你会使用IDSomeBoolean将它变为复合外键,但我认为它实际上并不关心它的价值是什么

答案 2 :(得分:-1)

某些数据库中(我无法检查SQL Server),您可以添加引用其他表的检查约束。

ALTER TABLE a ADD CONSTRAINT fancy_fk
CHECK (FK_BId IN (SELECT Id FROM b WHERE SomeBoolean));

我不相信这种行为是标准的。