ORA-01779: 無法修改與非鍵值保存表對應的列


項目中通過子查詢更新數據時遇到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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM