ORA-01779的處理方法
Oracle中試圖對一個子查詢進行更新時可能會出現ORA-01779錯誤。該錯誤的內容為:
INSERT INTO test1 VALUES (1,0);
INSERT INTO test1 VALUES (2,0);
INSERT INTO test1 VALUES (3,0);
INSERT INTO test1 VALUES (4,0);
CREATE TABLE test2 ( id integer, num integer, upd integer );
INSERT INTO test2 VALUES (1,10, 0);
INSERT INTO test2 VALUES (2,20, 1);
UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2
FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1 )
SET num1=num2; ORA-01779: cannot modify a column which maps to a non-key-preserved table
( SELECT /*+ BYPASS_UJVC */ t1.id id1, t1.num num1, t2.id id2, t2.num num2
FROM test1 t1, test2 t2
WHERE t1.id=t2.id AND t2.upd=1 )
SET num1=num2;
ORA-01779: cannot modify a column which maps to a non-key-preserved table
例如,使用以下的更新查詢就會出現該錯誤。
CREATE TABLE test1 ( id integer primary key, num integer );INSERT INTO test1 VALUES (1,0);
INSERT INTO test1 VALUES (2,0);
INSERT INTO test1 VALUES (3,0);
INSERT INTO test1 VALUES (4,0);
CREATE TABLE test2 ( id integer, num integer, upd integer );
INSERT INTO test2 VALUES (1,10, 0);
INSERT INTO test2 VALUES (2,20, 1);
UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2
FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1 )
SET num1=num2; ORA-01779: cannot modify a column which maps to a non-key-preserved table
這個錯誤的意思是,子查詢的結果中,更新資料來源(test2)的內容不唯一,導致被更新物件(test1)中的一行可能對應資料來源(test2)中的多行。 本例中,test2表的id不唯一,因此test2表中可能存在id相同但是num不相同的資料,這種資料是無法用來更新 test1 的。
解決方法就是保證資料來源的唯一性,例如本例中可以為test2.id建立一個唯一索引:
CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);之後上面的更新就可以執行了。
另外也可以強制 Oracle 執行,方法是加上 BYPASS_UJVC 註釋。
UPDATE( SELECT /*+ BYPASS_UJVC */ t1.id id1, t1.num num1, t2.id id2, t2.num num2
FROM test1 t1, test2 t2
WHERE t1.id=t2.id AND t2.upd=1 )
SET num1=num2;
BYPASS_UJVC的作用是跳過Oracle的鍵檢查。 這樣雖然能夠執行了,但是如果test2中存在不唯一的資料,test1就會被更新多次而導致意想不到的結果。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-919092/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 處理問題的方法
- JavaScript常用的字串處理方法JavaScript字串
- 高併發的處理方法
- ORACLE鎖等待的處理方法Oracle
- Smartform中的長文處理方法ORM
- 非同步處理方法非同步
- 影像預處理方法
- APM RUEI processor處理程式hang死處理方法
- 處理字串的方法都在這裡字串
- netvault Client **** is unreachable的處理方法client
- listener.log太大的處理方法
- 衝突處理的方法(轉載)
- oracle 誤刪除的處理方法Oracle
- JavaMail中文附件的處理方法 (轉)JavaAI
- 批處理打補丁的方法
- ORACLE資料庫壞塊的處理 (處理無物件壞快的方法)Oracle資料庫物件
- JVM如何處理方法呼叫JVM
- php事務處理方法PHP
- AlertDialog 處理方法二
- 異常處理方法 (轉)
- 影像資料不足時的處理方法
- 大量time-wait的處理方法AI
- 探討遊戲反饋的處理方法遊戲
- 【DG】 DataGuard 中處理archive gap的方法Hive
- ppt中插入和處理影片的方法
- C#的訊息處理方法 (轉)C#
- 爬蟲 | 處理cookie的基本方法——session爬蟲CookieSession
- ZooKeeper的系統列印Log的處理方法
- tcp中的粘包、半包的處理方法TCP
- 處理恢復資料方法
- 各種報錯處理方法
- SAP匯率損益處理方法
- Java--- 關於null的處理若干方法JavaNull
- TS - 處理故障的一些通用方法
- c# 一些警告的處理方法C#
- Linux記憶體不足的處理方法Linux記憶體
- 處理VM的一種特殊方法和思路
- 機器學習中資料缺失的處理及建模方法機器學習