upsert mysql_mysql – SQL标准UPSERT调用

MySQL和HSQLDB支持的唯一解决方案是查询要替换的行,并有条件地查询INSERT或UPDATE.这意味着您必须编写更多应用程序代码来补偿RDBMS实现之间的差异.

>开始交易.

> SELECT … FOR UPDATE.

>如果SELECT找到行,则UPDATE.

>其他,INSERT.

> COMMIT.

MySQL不支持ANSI SQL MERGE语句.它支持REPLACE和INSERT … ON DUPLICATE KEY UPDATE.有关详细信息,请参阅我对“INSERT IGNORE” vs “INSERT … ON DUPLICATE KEY UPDATE”的回答.

评论:是的,另一种方法是尝试INSERT并查看它是否成功.否则,请进行更新.如果您尝试INSERT并且它遇到重复键,它将生成错误,这在某些客户端接口中变为异常.在MySQL中执行此操作的缺点是,即使INSERT失败,它也会生成新的自动增量ID.所以你最终会有差距.我知道自动增量序列中的差距通常不值得担心,但是我去年帮助了一位客户,由于这种影响,成功插入之间的差距为1000-1500,结果是他们耗尽了范围. INT在他们的主键中.

正如@baraky所说,首先可以尝试更新UPDATE,如果这会影响零行,则执行INSERT.我对此策略的评论是,更新零行也不例外 – 您必须在UPDATE之后检查“受影响的行数”以了解它是否“成功”.

但是查询受影响的行数会使您回到最初的问题:您必须在MySQL和HSQLDB中使用不同的查询.

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT);

MySQL的:

SELECT ROW_COUNT();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值