使用自引用外键向表添加行

时间:2019-01-25 22:28:04

标签: sql oracle

我创建了一个名为TableTest的表,其中包含两列entdepent是主键,dep是引用ent的外键。我使用以下方法创建表:

CREATE TABLE TableTest (
  ent varchar(2) NOT NULL,
  dep varchar(2),
  PRIMARY KEY (ent),
  FOREIGN KEY (dep) REFERENCES TableTest(ent)
);

我必须证明三个值(A1,A2,A3)相互依赖。 A3依赖于A1等。但是,当我尝试在表中插入一行时,例如:

INSERT INTO TableTest(ent, dep)
  VALUES ('A1','A3');

我收到以下错误,并且在进行研究后,我仍然对如何解决这个问题感到困惑。我是SQL的新手。

  

ORA-02291:违反了完整性约束-未找到父密钥

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

首先,您需要插入root value

> insert into TableTest values ('A1', null);
> insert into TableTest values ('A3', 'A1');

答案 1 :(得分:0)

Pablo's answer可以,但是如果您不想拥有null,也可以做其他事情;首先为PKFK插入相同的值,然后插入关系:

insert into TableTest values ('A1', 'A1');
insert into TableTest values ('A3', 'A1');

答案 2 :(得分:0)

在某些情况下,就像您发布的情况一样,循环引用(顺便说是很好,那里没有逻辑问题)与关系完整性约束的正常工作方式相冲突。这是因为关系完整性具有某些“方向性”功能(首先是主键,然后是外键),即使依赖性可以是循环的,如您所见。

有几种解决方法。最简单的方法是使外键约束deferred。这意味着仅在您commit时才检查约束,而不是在每个单独的insert之后才检查约束。

另一种方法是同时插入所有值(在同一INSERT语句中);例如:

insert into tabletest(ent, dep)
  select 'A1', 'A3' from dual union all
  select 'A3', 'A2' from dual union all
  select 'A2', 'A1' from dual
;