ORA-01779: cannot modify a column which maps to a non-key-preserved table
2008-05-08 13:21
573 查看
ORA-01779: cannot modify a column which maps to a non-key-preserved table
2007-08-23 14:31
2007-08-23 14:31
Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误。该错误的内容为: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就会被更新多次而导致意想不到的结果。 |
相关文章推荐
- ORA-01779: cannot modify a column which maps to a non key-preserved table
- ORA-01779: cannot modify a column which maps to a non key-preserved table
- 解决错误ORA-01779: cannot modify a column which maps to a non-key-preserved table
- ORA-01779: cannot modify a column which maps to a non-key-preserved table分析
- ORA-01779: cannot modify a column which maps to a non-key-preserved table
- ora-01779 non-key-preserved table错误及/*+ BYPASS_UJVC*/ 的使用技巧
- ORA-01445: Cannot Select ROWID from a Join View without a Key-Preserved Table
- How to modify non-customizable entity in MS Dynamics CRM 4.0 (Add Product price column to Price List Item view)
- Cannot convert value '0000-00-00 00:00:00' from column 1 to TIMESTAMP .
- 在视图或者子查询中查询rowid出错提示cannot select ROWID from a join view without a key-preserved table
- Android编译遇到-Unable to execute dex: Cannot merge new index 65761 into a non-jumbo instruction!
- Cannot refer to a non-final variable * inside an inner class defined in a different method"错误解析
- A useful function which used to split data by ',' from one column
- 解决RPE-01012: Cannot deploy PL/SQL maps to this target schema.
- line 1 of the inf file winnt.xpe is invalid setup cannot continue. press any key to exit
- Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
- Cannot refer to a non-final variable i inside an inner class defined in a differ
- Cannot make a static reference to the non-static method print(Animal) from the type demo1的解决
- [2017-03-04]Cannot make a static reference to the non-static method.....
- hibernate报错:JoinColumn cannot be resolved to a type