约束相互依赖的表

时间:2017-07-25 11:11:28

标签: sql oracle

我创建了两个相互依赖的表格。

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) - 未找到父密钥

如何在表ab

中插入数据

3 个答案:

答案 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;