问题描述
SQL> CREATE TABLE A(NO1 NUMBER(2) 主键,NO2 NUMBER(2));
创建的表。
SQL> CREATE TABLE B(NO1 NUMBER(2) 主键,NO2 NUMBER(2));
创建的表。
SQL> ALTER TABLE A添加约束AA外键 (NO2) 引用B(NO1);
表变了。
SQL> ALTER TABLE B添加约束BB外键 (NO2) 引用B(NO1);
表变了。
SQL> 插入到一个值 (10,20) 中;
插入值 (10,20)
*
第1行的错误:
ORA-02291: 完整性约束 (SUBK.AA) 违反-找不到父项
SQL> 插入到B值 (10,20);
插入B值 (10,20)
*
第1行的错误:
ORA-02291: 完整性约束 (SUBK.BB) 违反-找不到父键
创建的表。
SQL> CREATE TABLE B(NO1 NUMBER(2) 主键,NO2 NUMBER(2));
创建的表。
SQL> ALTER TABLE A添加约束AA外键 (NO2) 引用B(NO1);
表变了。
SQL> ALTER TABLE B添加约束BB外键 (NO2) 引用B(NO1);
表变了。
SQL> 插入到一个值 (10,20) 中;
插入值 (10,20)
*
第1行的错误:
ORA-02291: 完整性约束 (SUBK.AA) 违反-找不到父项
SQL> 插入到B值 (10,20);
插入B值 (10,20)
*
第1行的错误:
ORA-02291: 完整性约束 (SUBK.BB) 违反-找不到父键
专家解答
如果你有形成一个圆的外键,你需要声明其中至少一个可延期 (最初延期):
这将延迟验证约束,直到您提交。所以,如果你添加的行永远不会得到父,你会看到和错误,当事务结束:
CREATE TABLE A(NO1 NUMBER(2) PRIMARY KEY,NO2 NUMBER(2)); CREATE TABLE B(NO1 NUMBER(2) PRIMARY KEY,NO2 NUMBER(2)); ALTER TABLE A ADD CONSTRAINT AA FOREIGN KEY(NO2) REFERENCES B(NO1); ALTER TABLE B ADD CONSTRAINT BB FOREIGN KEY(NO2) REFERENCES B(NO1) deferrable initially deferred; INSERT INTO B VALUES(10,20); INSERT INTO A VALUES(20,10); select * from a; NO1 NO2 20 10 select * from b; NO1 NO2 10 20
这将延迟验证约束,直到您提交。所以,如果你添加的行永远不会得到父,你会看到和错误,当事务结束:
INSERT INTO B VALUES(11,30); commit; ORA-02091: transaction rolled back ORA-02291: integrity constraint (CHRIS.BB) violated - parent key not found
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




