2015-03-31 24 views
1

我無法在網絡上找到解決方案。我想知道如何在oracle中編寫遞歸關係。目前這是我得到的:什麼是oracle 11g中的遞歸關係的符號?

create table medewerkers 
(medewerker_ID   varchar(15) primary key, 
naam     varchar(50) not null, 
adres     varchar(50) not null, 
telefoon_nummer   varchar(10) not null, 
salaris     number(4) not null, 
functie     varchar(50) not null, 

manager     varchar(15) constraint FK_Manager references medewerkers (medewerker_ID) on delete cascade, 
werknemer_winkel_nummer number(15) constraint FK_W_winkel references winkel (winkel_nummer) on delete cascade, 
constraint check_salaris check (salaris < 3000) 
); 

此刻,我創建了一個經理列作爲此遞歸關係的FK。我沒有創建額外的表格,因爲我被告知,如果他們與員工是一對多的,那麼我可以將FK放在表格中。

現在我插入值,像這樣的:

insert into MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager) 
values(11159112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, 'baliemedewerker', 10, 'nee'); 

Oracle數據庫提供了一個錯誤回:

SQL Error: ORA-02291: integrity constraint (MAXIME.FK_MANAGER) violated - parent key not found 
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found" 
*Cause: A foreign key value has no matching primary key value. 
*Action: Delete the foreign key or add a matching primary key. 

我怎麼否則應該得到的值到經理欄?

我希望我的問題不太含糊。

+2

在插入具有'nee'作爲其管理者的行之前,你需要用'medewerker_ID' ='nee'插入該行。這就是外鍵約束強制執行的內容。如果您必須無序插入,您可以將約束條件設置爲「可延遲」。 – 2015-03-31 12:22:51

+0

這正是我所期待的那種情況!非常感謝 – 2015-03-31 13:07:24

回答

2

在添加下屬之前,您需要確保經理在那裏。

的CEO /經理/所有者可以用NULL經理可以添加:

INSERT INTO MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager) 
VALUES ('nee', 'The Boss Man', 'Home Office', '0000000001', 9999, 'Owner', 10, NULL); 

員工隨後可以用正確的外鍵引用(根據OP)加入。

另外 - 如果你輸入的電話號碼是0,那麼你可能想用數據包裝'',否則你會發現從數字到varchar的轉換將失去它。

[另一方面:你真的想在外鍵上使用ON DELETE CASCADE嗎?如果你刪除了一個管理員,那麼他們的所有員工也將被刪除。]

+0

你是對的!託尼安德魯斯首先提供了這個awnser,但你的解釋是一樣的。我標記你的awnser是解決我的問題的方法。 – 2015-03-31 13:09:59

1

您的問題是完美的。

您是否考慮暫時禁用FK_Manager約束,以便您可以添加頂級管理?然後啓用約束,同時添加員工的下一級別?

只是一個想法。

+0

託尼安德魯斯給我提供了合適的維修人員。感謝您的回覆,但 – 2015-03-31 13:08:15

+0

是的,使用延遲是更好的解決方案。好吧! – StewS2 2015-04-01 15:22:33