2017-07-25 101 views
0

我创建了2个这样相互依赖的表。约束相互依赖的表

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); 

表改变了。 ORA - : ORA-02291:父键未找到

INSERT INTO B VALUES(10,20); 
INSERT INTO B VALUES(10,20); 

ERROR位于第1行违反完整性约束(SUBK.AA)

INSERT INTO A VALUES(10,20); 
INSERT INTO A VALUES(10,20); 

位于第1行错误-02291:违反完整性约束(SUBK.BB) - 未找到父键

如何在表a插入数据和b

+0

为什么你想在第一时间建立这样的限制?将数据插入到多个表中是不可能的,因此如果两个表中都有外键,则根本无法向它们插入任何新数据... –

+1

SQL Server不会返回ORA错误。 –

+0

我假设'BB'是为了引用'A(NO1)'而不是'B' - 因为否则,B似乎独立于'A',你只需要首先对它进行多行插入。 –

回答

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); 
+0

修改表B添加约束BB外键(NO2)参考A(NO1);即使我将约束更改为不同的表格。我无法插入数据 –

+0

请参阅解决方案更新 – user7294900

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,所以我改变了它。

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;