尽管我现在使用的是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)
长期以来,此操作需要两个单独的命令以及一些框架来处理。因此,名称为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。