ORA-017779:无法修改映射到非密钥保留表的列

时间:2013-09-12 08:27:44

标签: oracle oracle9i

如何解决此错误:

  

ORA-017779:无法修改映射到非密钥保留表的列。

我的代码:

UPDATE   (SELECT SOBS034.T1 as OLD, SOBS063.T1 as NEW
          FROM SOBS034 
          INNER JOIN SOBS063  ON SOBS034.ID = SOBS063.ID
          where  SOBS034.ID='111000' AND SOBS063.T2='' ) t
SET t.OLD =t.NEW 

2 个答案:

答案 0 :(得分:3)

要更新JOIN,Oracle需要绝对确保对于您尝试更新的表的每一行,联接表的一行最多

此时,您将能够更新联接当且仅当 SOBS063.ID是唯一的时(由唯一约束/ pk明确声明)。

如果某个SOBS063.ID对于具有您的连接条件的此记录是唯一的,但未声明为此类,则您将无法使用此方法。但是,您可以将此DML转换为等效的MERGE,如下所示:

MERGE INTO SOBS034 a
USING SOBS063 b
ON (a.id = b.id AND a.ID='111000' AND b.T2 IS NULL)
WHEN MATCHED THEN UPDATE SET a.t1 = b.t1;

顺便说一下,SOBS063.T2=''在Oracle中永远不会成为现实。

答案 1 :(得分:2)

尝试在SOBS034(ID)和SOBS063(ID)上创建唯一索引。