我创建了两个相互依赖的表格。
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);
表格改变了。
INSERT INTO A VALUES(10,20);
INSERT INTO A VALUES(10,20);
第1行的错误: ORA-02291:违反了完整性约束(SUBK.AA) - 未找到父密钥
INSERT INTO B VALUES(10,20);
INSERT INTO B VALUES(10,20);
第1行的错误: ORA-02291:违反了完整性约束(SUBK.BB) - 未找到父密钥
如何在表a
和b
答案 0 :(得分:0)
您创建了无效的约束:
ALTER TABLE B ADD CONSTRAINT BB FOREIGN KEY(NO2) REFERENCES B(NO1);
外键应该是不同的表,而不是同一个表中的列。
如果你想要圆形约束A - >; B和B - > A您可以插入第一个数据然后添加约束。您的外键应该指向主键,因此新的SQL将是:
CREATE TABLE A(NO1 NUMBER(2) PRIMARY KEY,NO2 NUMBER(2));
CREATE TABLE B(NO1 NUMBER(2) PRIMARY KEY,NO2 NUMBER(2));
INSERT INTO A VALUES(10,20);
INSERT INTO B VALUES(10,20);
ALTER TABLE A ADD CONSTRAINT AA FOREIGN KEY(NO1) REFERENCES B(NO1);
ALTER TABLE B ADD CONSTRAINT BB FOREIGN KEY(NO1) REFERENCES A(NO1);
答案 1 :(得分:0)
延迟你的约束。这样做会导致在事务提交之前不会强制执行它们。
在此设置下,只要两次插入都发生在同一事务中,就可以将记录插入到两个表中而不会出现错误。
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) INITIALLY DEFERRED DEFERRABLE;
ALTER TABLE B ADD CONSTRAINT
BB FOREIGN KEY(NO2) REFERENCES A(NO1) INITIALLY DEFERRED DEFERRABLE;
INSERT INTO A VALUES(10,20);
INSERT INTO B VALUES(20,10);
COMMIT;
注意:我假设你想让BB约束引用表A,所以我改了它。
答案 2 :(得分:0)
你要求麻烦;-),但你可以分两步完成:
insert into A values(10, null);
insert into B values(20, null);
update A set no2 = 20 where no1 = 10;
update B set no2 = 10 where no1 = 20;