可能重复:
Oracle:如何UPSERT(更新或插入表?)
嗨,
我有一个表,如果记录已经存在,则必须修改该记录,否则必须插入新记录.Oracle sql不接受IF EXISTS,否则我会做一个if - update - else - insert查询.我看过MERGE但它只适用于多个表.我该怎么办?
Ton*_*ews 63
MERGE不需要"多个表",但确实需要查询作为源.这样的事情应该有效:
MERGE INTO mytable d
USING (SELECT 1 id, 'x' name from dual) s
ON (d.id = s.id)
WHEN MATCHED THEN UPDATE SET d.name = s.name
WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);
Run Code Online (Sandbox Code Playgroud)
或者你可以在PL/SQL中执行此操作:
BEGIN
INSERT INTO mytable (id, name) VALUES (1, 'x');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
UPDATE mytable
SET name = 'x'
WHERE id = 1;
END;
Run Code Online (Sandbox Code Playgroud)
merge into MY_TABLE tgt
using (select [expressions]
from dual ) src
on (src.key_condition = tgt.key_condition)
when matched then
update tgt
set tgt.column1 = src.column1 [,...]
when not matched then
insert into tgt
([list of columns])
values
(src.column1 [,...]);
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以使用SQL%ROWCOUNTOracle变量:
UPDATE table1
SET field2 = value2,
field3 = value3
WHERE field1 = value1;
IF (SQL%ROWCOUNT = 0) THEN
INSERT INTO table (field1, field2, field3)
VALUES (value1, value2, value3);
END IF;
Run Code Online (Sandbox Code Playgroud)
仅确定您的主键(即field1)是否具有值,然后相应地执行插入或更新会更容易。也就是说,如果您将所述值用作存储过程的参数。