暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 相互依赖的外键约束

askTom 2017-07-25
519

问题描述

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) 违反-找不到父键

专家解答

如果你有形成一个圆的外键,你需要声明其中至少一个可延期 (最初延期):

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论