【发布时间】:2017-01-18 08:55:51
【问题描述】:
我在 oracle 11g 上提出了以下用于合并数据的 sql 语句。
MERGE INTO myTable tgt
USING ( SELECT myTable.ROWID AS rid
FROM myTable
WHERE myTable.myRef = 'uuuu' or
myTable.name = 'sam'
--union
--select rowId,null from dual
) src
ON (tgt.rowid = src.rid)
WHEN MATCHED THEN
update set tgt.myRef = 'uuuu',tgt.name='name_worked'
when not matched then
insert (
tgt.myRef,tgt.name) values ('RRRR','HHH');
我需要在此处插入除 ID 列之外的数据,这将通过主键插入触发器进行管理。由于错误ORA-38104: Columns referenced in the ON Clause cannot be updated,我在这里使用了 RowId 方法。
现在我的问题是合并语句在更新时工作正常,但在这种情况下插入数据失败。
我浏览了这个post 并添加了联合声明。但是由于我的表中的约束而不是顺利运行它,在插入重复记录时仍然失败。
有人可以帮我吗?非常欣赏它。谢谢你。
==========已编辑============
请在下面找到完整的代码示例和错误消息。
MERGE INTO myTable tgt
USING ( SELECT myTable.ROWID AS rid
FROM myTable
WHERE myTable.myRef = 'RRRR' or
myTable.mytablename = 'sam'
union
select rowId from dual
) src
ON (tgt.rowid = src.rid)
WHEN MATCHED THEN
update set tgt.myRef = 'uuuu',tgt.mytablename='myt_name', tgt.name='nameA'
when not matched then
insert (
tgt.mytableid,tgt.mytablename,tgt.name,tgt.myRef) values (11,'RRRR','HHH','myref1');
我的桌子是-
CREATE TABLE "sa"."MYTABLE"
(
"MYTABLEID" NUMBER NOT NULL ENABLE,
"MYTABLENAME" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"NAME" VARCHAR2(20 BYTE),
"MYREF" VARCHAR2(20 BYTE),
CONSTRAINT "MYTABLE_PK" PRIMARY KEY ("MYTABLEID", "MYTABLENAME")
)
如果我第一次运行它,它将按预期插入记录。
当我第二次运行它时,我的期望是它应该匹配myRef = 'RRRR' 并进行更新。我故意在条件之间加上“或”,因为如果我发现表中存在任何值,它应该去更新现有记录。
但不会进行更新,而是会抛出此错误,因为合并语句尝试再次插入。
SQL Error: ORA-00001: unique constraint (sa.MYTABLE_PK) violated
00001. 00000 - "unique constraint (%s.%s) violated"
我的要求是当它第一次运行时它应该插入,当我再次运行它时它应该选择该记录并更新它。请让我知道在我的合并语句中要调整什么,以便在此处按预期工作。提前致谢。
【问题讨论】:
-
两个问题:1)您提到的“我的表中的约束”(和错误消息)是什么?如果您源中没有联合,ON 子句将始终找到匹配项 - 除非@987654322 @ - 并且不会发生任何插入。 2)您希望插入在哪种情况下发生?
-
插入失败的错误信息是什么?
-
可能是条件 tgt.rowid = src.rid 在所有情况下都满足
-
请参阅上面已编辑的问题以及更多详细信息。非常感谢您的 cmets。
-
您是否使用 ROWID 作为您的一个表中的列名?
标签: sql oracle oracle11g merge