2015-03-31 23 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