一尘不染

ANSI SQL问题-如果记录已经存在,如何插入或更新?

sql

尽管我现在使用的是mySQL,但我不希望使用任何特定于数据库的SQL。

我试图插入一条记录(如果它不存在),并更新一个字段(如果它确实存在)。我想使用ANSI SQL。

该表如下所示:

create table test_table (id int, name varchar(16), weight double) ;

//test data 
insert into test_table (id, name, weight) values(1,'homer', 900);
insert into test_table (id, name, weight) values(2,'marge', 85);
insert into test_table (id, name, weight) values(3,'bart', 25);
insert into test_table (id, name, weight) values(4,'lisa', 15);

If the record exists, I want to update the weight (increase by say 10)

阅读 173

收藏
2021-05-16

共1个答案

一尘不染

长期以来,此操作需要两个单独的命令以及一些框架来处理。因此,名称为UPSERT(UPdate或inSERT)。但是,某些风味的DBMS的最新版本支持更完善的解决方案。

ANSI标准定义了MERGE语法。从9i版开始,Oracle就支持此功能;从2005年起,在MS SQL Server中已经支持此功能。MERGE语句可能有些冗长。

merge into t23
using t42
on t42.id = t23.id
when matched then
    update
    set     t23.col1 = t42.col1
when not matched then
    insert  (id, col1)
    values  (t42.id, t42.col1)
/

我认为MERGE语句最初被设想为数据迁移工具,因此它的语法要求我们在USING子句中从表中选择数据。我们可以通过从行生成设备(例如Oracle中的double)中选择文字和伪列来解决此限制。

MySQL具有明显不同的语法INSERT … ON DUPLICATE KEY
UPDATE

2021-05-16