sql - 需要可移植的 SQL upsert(插入+更新)解决方案

标签 sql mysql sql-server database oracle

我需要对数据库执行一个非常简单的操作 - 将一些值按键放入表中,如果该行存在 - 更新它,如果不存在 - 创建一个新行。问题是我需要以一种可移植的方式来做——即相同的查询必须在 MySQL、SQL Server、Oracle 上工作,最好也能在 DB2、Postgres 等上工作。所以虽然我可以使用 REPLACEINSERT ... ON DUPLICATE KEY UPDATE 在 MySQL 中,我不确定它们是否支持这种语法。而且我真的想避免按数据库类型分类,因为这将无法维护。我也不想在更新之前实际查询值,因为我怀疑它会显着减慢进程(我需要多次执行)。

到目前为止,我想到的最好的办法就是:

  UPDATE table SET data='data' WHERE key='key';
  INSERT INTO table(key, data) VALUES ('key', 'data');

其中一个总是成功,另一个总是失败,但我不在乎其中一个查询失败。虽然看起来有点不雅观。有什么建议可以让它变得更好吗?

最佳答案

唯一完全与数据库无关的解决方案,使用有点现代的数据库,是在两个操作中调用更新然后插入。有些数据库不允许在单个操作中发送多个语句,有些数据库可能不会返回受更新影响的行数,因此我不会依赖它。

Update MyTable
Set Data = 'Data'
Where KeyCol = 'key';

(单独调用)

Insert Into MyTable(KeyCol, Data)
Select 'key', 'Data'
From ( Select 1 As Value ) As Z
Where Not Exists    (
                    Select 1
                    From MyTable As T1
                    Where T1.KeyCol = 'key'
                    );

关于sql - 需要可移植的 SQL upsert(插入+更新)解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495587/

相关文章:

sql - 从 SQL Server 表中的连字符字符串列中提取第 1 个、第 2 个、第 3 个值,直到第 n 个值

sql - 如果有多个Position,则只找到主要的Position,否则取另一个Position

mysql - 使用特定格式的字段进行查询

mysql - 将前导零添加到 MySQL 中的值

mysql - 我无法在带有 auto_increment 列的表中插入一行

php - 使用 Xampp/Wamp 是必要的还是只是一种选择?

php - array_unique 不删除重复值 php

c# - 在数据库 SQL 中计算平均值

sql - 在ORDER BY中使用SQL串联

c# - 无法打开,因为它是 706 版本。此服务器支持 662 及更早版本。不支持降级路径