我需要对数据库执行一个非常简单的操作 - 将一些值按键放入表中,如果该行存在 - 更新它,如果不存在 - 创建一个新行。问题是我需要以一种可移植的方式来做——即相同的查询必须在 MySQL、SQL Server、Oracle 上工作,最好也能在 DB2、Postgres 等上工作。所以虽然我可以使用 REPLACE
或INSERT ... 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/