Привет.
Есть таблица:
Поле PARENT_ID может быть либо null, либо ссылаться на другую запись в рамках GROUP_ID, но не на саму себя.
Накладываю ограничение:
Добваляю данные:
При попытке изменить значение поля PARENT_ID на любое, кроме null, вызывает ругань на нарушение констрейнта CHK_T.
Удаляю констрейнт CHK_T и добавляю его в виде FK и CHECK:
В таком варианте ограничения работают правильно.
Что не так в первом варианте CHK_T?
С уважением, Polesov.
Есть таблица:
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.