您可以強制使用複合鍵中的業務規則上(Id, SomeBoolean)
,在FK_BSomeBoolean
與CHECK
約束表A
引用此,以確保它始終是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)
);
我會把'A'中的列作爲計算列而不是使用檢查約束,但這只是一種品味/風格的東西。 – 2011-05-11 07:57:09