2017-07-25 37 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;