mysql – SQL标准UPSERT调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – SQL标准UPSERT调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1617字,纯文字阅读大概需要3分钟。
内容图文
我正在寻找一个标准的SQL“UPSERT”声明.如果存在,则插入和更新一次调用.
我正在寻找一个有效,高效的跨平台电话.
我见过MERGE,UPSERT,REPLACE,INSERT ..在DUPLICATE UPDATE但没有声明符合需求.
顺便说一句,我使用MYSQL和HSQLDB进行unitests.我知道HSQLDB是有限的,可能无法满足我的需求,但即使没有它,我也找不到标准的方法.
现在只有MYSQL和HSQLDB才足够的声明.
我一直在寻找一段时间,但无法得到答案.
我的桌子:
CREATE TABLE MY_TABLE (
MY_KEY varchar(50) NOT NULL ,
MY_VALUE varchar(50) DEFAULT NULL,
TIME_STAMP bigint NOT NULL,
PRIMARY KEY (MY_KEY)
);
任何想法?
解决方法:
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();
内容总结
以上是互联网集市为您收集整理的mysql – SQL标准UPSERT调用全部内容,希望文章能够帮你解决mysql – SQL标准UPSERT调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。