oracle 11g中递归关系的符号是什么?

时间:2015-03-31 12:16:13

标签: sql oracle recursion oracle11g foreign-keys

我无法在网上找到解决方案。我想知道如何在oracle中编写递归关系。目前这就是我得到的:

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。我没有创建额外的表,因为我被告知如果他们与员工是1对多,那么我可以将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 db发回错误:

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 个答案:

答案 0 :(得分:2)

在添加下属之前,您需要确保经理在那里。

首席执行官/经理/所有者可以添加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吗?如果您删除经理,那么他们的所有员工也将被删除。]

答案 1 :(得分:1)

你的问题已经完美形成了。

您是否考虑暂时禁用FK_Manager约束,以便添加顶级管理?然后在添加员工的下一级别时启用约束?

只是一个想法。