你好,
我有一张表格,如果记录已经存在,则必须修改该记录,否则必须插入新记录。
Oracle sql不接受IF EXISTS
,否则我将执行if-update-else-insert
查询。我查看了MERGE
,但它仅适用于多个表格。我该怎么办?
你好,
我有一张表格,如果记录已经存在,则必须修改该记录,否则必须插入新记录。
Oracle sql不接受IF EXISTS
,否则我将执行if-update-else-insert
查询。我查看了MERGE
,但它仅适用于多个表格。我该怎么办?
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);
或者您可以在 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;
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 [,...]);
SQL%ROWCOUNT
Oracle变量: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;
如果您的主键(即field1
)有值,那么确定后再执行插入或更新操作会更容易。也就是说,如果您将这些值用作存储过程的参数。
insert
,如果由于唯一性约束而失败,则说明该行已存在,update
。insert
命令。)select count(*) .. where ..
,即使它返回零,并且你选择执行insert
,在你执行select
和insert
之间,其他人可能已经insert
了该行,因此你的insert
将失败。HC-way :)
DECLARE
rt_mytable mytable%ROWTYPE;
CURSOR update_mytable_cursor(p_rt_mytable IN mytable%ROWTYPE) IS
SELECT *
FROM mytable
WHERE ID = p_rt_mytable.ID
FOR UPDATE;
BEGIN
rt_mytable.ID := 1;
rt_mytable.NAME := 'x';
INSERT INTO mytable VALUES (rt_mytable);
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
<<update_mytable>>
FOR i IN update_mytable_cursor(rt_mytable) LOOP
UPDATE mytable SET
NAME = p_rt_mytable.NAME
WHERE CURRENT OF update_mytable_cursor;
END LOOP update_mytable;
END;
如果您想在Oracle中使用UPSERT/MERGE命令,请参考this问题。否则,您可以先执行count(1)
,然后决定是插入还是更新来解决客户端的问题。
MERGE
指令,但是对于异常DUP_VAL_ON_INDEX
处理,这绝对是一个好的解决方案,因为Oracle异常处理通常用于这种行为!=) - Will MarcouillerMERGE INTO
语句后在OracleSQL数据库中看到结果,请确保通过运行COMMIT;
提交事务。 - Vincent