繁体   English   中英

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

[英]Adding rows to table with self-referencing foreign key

我创建了一个名为TableTest的表,其中包含两列entdep ent是主键,而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:违反完整性约束-找不到父密钥

任何帮助是极大的赞赏!

首先,您需要插入root value

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

Pablo的答案还可以,但是如果您不想使用null也可以做一些其他事情。 首先为PKFK插入相同的值,然后插入关系:

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

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

有几种解决方法。 最简单的方法是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
;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM