項目中通過子查詢更新數據時遇到ORA-01779: 無法修改與非鍵值保存表對應的列,模擬過程如下:
1、創建測試表
1 CREATE TABLE tt1 (ID INT,col1 VARCHAR2(20)); 2 CREATE TABLE tt2 (ID INT,cola VARCHAR2(20));
2、錄入測試數據
1 INSERT INTO tt1 VALUES(1,'tt1id1'); 2 INSERT INTO tt1 VALUES(2,'tt1id2'); 3 INSERT INTO tt2 VALUES(1,'tt2id1'); 4 INSERT INTO tt2 VALUES(2,'tt2id2'); 5 INSERT INTO tt1 VALUES(3,'tt1id3'); 6 INSERT INTO tt2 VALUES(4,'tt2id4'); 7 COMMIT;
3、執行更新
1 UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE tt1.ID=tt2.ID) 2 SET col1=cola;
報錯:ORA-01779: 無法修改與非鍵值保存表對應的列
4、分析
根據錯誤提示:”無法修改與非鍵值保存表對應的列”,初步推斷為tt2中沒有主鍵?
那么在tt2上添加主鍵后再更新試試
1 ALTER TABLE tt2 ADD CONSTRAINT pk_tt2_id PRIMARY KEY(ID); 2 3 UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE tt1.ID=tt2.ID) 4 SET col1=cola;
發現可以成功更新數據。
然后將在tt2上加的主鍵刪除,再在tt1上添加主鍵試試,
1 ALTER TABLE tt2 DROP CONSTRAINT pk_tt2_id; 2 ALTER TABLE tt1 ADD CONSTRAINT pk_tt1_id PRIMARY KEY(ID);
再執行第3 步中的更新語句,發現還是報錯:ORA-01779: 無法修改與非鍵值保存表對應的列
5、結論:
用A表去更新B表的數據,A表的關聯條件必須為主鍵,Oracle這樣做的目的是保證表A的滿足關聯條件的數據是唯一的,
這樣在更新B表數據時才有意義,
當然,如果兩表關聯的字段都為主鍵,則無論誰更新誰都沒有問題。
結論:用A表數據更新B表數據,則A與B的對應關系為:1:1 或 1:n。