如何解决此错误:
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
答案 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)上创建唯一索引。