2013-05-27 83 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列,如果ID包含ParentID = 0,則ParentID可以是該ID。

問題是我可以這樣做嗎?

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>)) 

使那些其實並不在TABLE_NAME PARENT_ID的將無法插入。

+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