插入,如果没有什么更新

问题描述:

我需要做一个sql查询,试图通过主键更新一个行,如果它不存在插入它。对于大多数数据库(MySQL,H2,Postgres,Oracle,DB2,MSSQL,Hsql,Derby),该解决方案需要具有通用性。插入,如果没有什么更新

有关代码示例,请考虑一个简单的表格由两列:ID(Pr.Key)和TXT

+2

这个名字是'UPSERT'。它通常通过'MERGE'实现,但这绝不是普遍可用的。你能对“大多数数据库”更具体吗? – 2011-12-17 21:02:34

+1

@Oded没有。我不知道该怎么尝试 – 2011-12-17 21:02:39

+0

@MartinSmith我知道MySQL中有一个'REPLACE'语句,它完全符合我的要求,但它只适用于MySQL,所以本地解决方案不适合 – 2011-12-17 21:05:23

你想SQL的MERGE声明,但它不工作无处不在:

MERGE into thetable using (select theid from thetable) 
when matched then update thetable thecolumn = thevalue where id = theid 
when not matched then insert into thetable blablabla; 

另一个解决办法是尝试反正插入,处理错误,检测是否是一个约束冲突如果是的话更新。

+0

这与'解决方案需要普及'矛盾。 – GSerg 2011-12-17 21:07:25

+1

嗯,它是最普遍的,我可以提出要求......另一种解决方案是尝试插入,但这意味着要检测到错误是唯一的关键约束违规! – fge 2011-12-17 21:30:43

你必须使用一个存储过程来做到这一点。 请参阅:http://jumpingbean.co.za/blog/mysql-if-exists-update-else-insert

+2

这应该是一条评论。 – Oded 2011-12-17 21:01:44

+0

你能更具体吗?如果该表包含两列:id(Pr.Key)和txt,查询将会是什么样子? – 2011-12-17 21:06:51

可能:

INSERT INTO table (id,txt) VALUES (1,"Hello") 
    ON DUPLICATE KEY UPDATE txt="World"; 

但这是MySQL只