2013-05-27 3 views
3

Моя таблица является родительско-дочерней таблицей, где она содержит два столбца. Первый столбец - ID, который является автоматическим номером. Другая колонка - ParentID, которая имеет особые условия. Если строка является родительской, то ParentID = 0 в противном случае она должна быть связана со строкой ParentID. Например:Могу ли я использовать инструкцию select с контрольным ограничением

**ID** | **ParentID** 
--------------------- 
1  0 
2  0 
3  2 
4  [it can be 0 or 1 or 2 NOT 3] 

ParentID зависит от столбца ID, если идентификатор содержит ParentID = 0, то ParentID может быть этот идентификатор.

Вопрос в том, могу ли я сделать что-то подобное?

constraint ParentID_ck ckeck(ParentID in(0, select ID from table where ParentID = 0;)) 

Или я должен использовать другие решения, такие как PL/SQL:

DECLARE 
--Somthing.. 
BEGIN 
--Somthing.. 
END; 

И поместить его в проверочном ограничении.

ответ

0

Вы можете сделать что-то вроде:

insert into TABLE_NAME(PARENT_ID,ID) 
(select <THE_PARENT_ID>, <ID> from DUAL where 
    exists (select 1 from TABLE_NAME where PARENT_ID = <THE_PARENT_ID>)) 

Так что те PARENT_ID ', которые на самом деле не в TABLE_NAME не будет вставлена.

+0

Мне нужно ограничить пользователя этим ограничением. Если пользователь не может вставить какую-либо строку, противоположную этому условию. – 7alhashmi

2

Вы должны осуществить это ограничение с сочетанием внешнего ключа и триггером
Вы можете использовать нуль-состояние внешнего ключ из таблицы для себя. (parentID == null shows the root nodes).
Для части select ID from table where ParentID = 0 (null) от ограничений вы можете use a after insert or update DML trigger, некоторые примеры триггеров можно найти here

0

Вы можете сделать это, фиксируя модель данных первой. В вашем столе есть два типа сущностей: «Родители и дети». Создайте отдельную таблицу для своих родителей, тогда вы можете использовать обычные ссылочные ограничения.

+0

Есть ли еще одно решение ограничить его внутри одной таблицы? – 7alhashmi

+0

Да (он сказал, неохотно), вы * можете * сериализовать каждую вставку/обновление/удаление и проверить ее с помощью триггеров, но когда существует более простое и эффективное решение, почему бы не использовать его? –

+0

Задача такая. благодаря – 7alhashmi

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