2015-10-13 5 views
1

Структура двух таблиц с полями, которые имеют значение:Constraint на основе отношений FK

TableA: Id (PK), Type 
TableB: Id (PK), TableAId (FK), ReferenceId (Self-reference key) 

мне нужно иметь ограничение, которое будет сказать:

TableB идентификаторСсылка столбец может и должен содержать значение ТОЛЬКО Если значение TableAId указывает на запись, значение типа которой> 1.

Как это сделать?

+0

Вы можете сделать это с помощью триггера INSERT/UPDATE. Это единственный способ сделать это, если вы хотите, чтобы принудительное исполнение было в SQL. –

ответ

0

Один метод, который не требует триггеров, имел избыточность данных.

Поместите столбец type в TableB вместе с ограничением. И добавить дополнительный уникальный ключ к TableA для внешнего ключа:

create table tableA (
    id int primary key, 
    type int, 
    constraint unq_type_id unique (type, id) 
); 

create table tableB (
    id int primary key, 
    type int, 
    tableAID int, 
    constraint fk_tableB_type_tableAID foreign key (type, tableAID) references tableA(type, id), 
    constraint chk_type check (type > 1) 
); 

Это хак, но это сделать то, что вы хотите без триггеров.

Разновидность этого метода не требует повторения type в обеих таблицах, но это требует дополнительных столбцов:

create table tableA (
    id int primary key, 
    type int, 
    typeIsValid as (case when type > 1 then 1 else 0 end) persisted, 
    constraint unq_type_id unique (typeIsValid, id) 
); 

create table tableB (
    id int primary key, 
    tableAID int, 
    typeIsValid as (1), 
    constraint fk_tableB_typeIsValid_tableAID foreign key (typeIsValid, tableAID) references tableA(type, id) persisted 
); 

Это работает даже в SQL Fiddle.

Смежные вопросы