Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Непонятки с check constraint

$
0
0
Привет.

Есть таблица:
create table T (
    GROUP_ID   integer not null,
    ITEM_ID    integer not null,
    PARENT_ID  integer
);

alter table T
  add constraint PK_T
      primary key ( GROUP_ID, ITEM_ID );

Поле PARENT_ID может быть либо null, либо ссылаться на другую запись в рамках GROUP_ID, но не на саму себя.

Накладываю ограничение:
alter table T
  add constraint CHK_T check ( ( PARENT_ID is null ) or
                               ( PARENT_ID in ( select ttt.ITEM_ID
                                                  from T as ttt
                                                 where ttt.GROUP_ID = GROUP_ID
                                                   and ttt.ITEM_ID <> ITEM_ID ) ) );


Добваляю данные:
insert into T ( GROUP_ID, ITEM_ID, PARENT_ID )
       values ( 1,        1,       null      );
insert into T ( GROUP_ID, ITEM_ID, PARENT_ID )
       values ( 1,        2,       null      );
insert into T ( GROUP_ID, ITEM_ID, PARENT_ID )
       values ( 1,        3,       null      );
commit;

При попытке изменить значение поля PARENT_ID на любое, кроме null, вызывает ругань на нарушение констрейнта CHK_T.

Удаляю констрейнт CHK_T и добавляю его в виде FK и CHECK:
alter table T
  add constraint FK_T
      foreign key ( GROUP_ID, PARENT_ID ) references T ( GROUP_ID, ITEM_ID );

alter table T
  add constraint CHK_T check ( PARENT_ID <> ITEM_ID );

В таком варианте ограничения работают правильно.

Что не так в первом варианте CHK_T?

С уважением, Polesov.

Viewing all articles
Browse latest Browse all 1677

Trending Articles