Вы можете принудительно применить бизнес-правило, используя составной ключ на (Id, SomeBoolean)
, сослаться на это в таблице A
с ограничением CHECK
на FK_BSomeBoolean
, чтобы убедиться, что оно всегда ИСТИНА. Кстати, я бы рекомендовал избегать 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)
);