当前位置: 首页 > 面试题库 >

SQL标准UPSERT呼叫

东方权
2023-03-14
问题内容

我在寻找标准的SQL“ UPSERT”语句。如果存在,则要求一次插入和更新。

我正在寻找一个工作,高效和跨平台的电话。

我见过MERGEUPSERTREPLACEINSERT .. ON DUPLICATE UPDATE但没有声明满足需求。

顺便说一句,我使用MYSQL和HSQLDB作为unitest。我知道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实现之间的差异。

  1. 开始交易。
  2. 选择…进行更新。
  3. 如果SELECT找到行,则进行UPDATE。
  4. 否则,请插入。
  5. 犯罪。

MySQL不支持ANSI SQL MERGE语句。它支持REPLACE和INSERT … ON DUPLICATE KEY
UPDATE。有关更多信息,请参见我对“ INSERT IGNORE”和“ INSERT … ON DUPLICATE KEY
UPDATE”的
回答。

关于评论:是的,另一种方法是只尝试INSERT并查看它是否成功。否则,请执行UPDATE。如果您尝试执行INSERT并按下重复键,则会生成错误,该错误在某些客户端接口中变成异常。在MySQL中执行此操作的缺点是,即使INSERT失败,它也会生成一个新的自动增量ID。因此,您最终会遇到空白。我知道通常不需要担心自动增量序列中的间隙,但是去年我帮助了一位成功插入之间的间隙为1000-1500的客户,由于这种影响,结果是他们用尽了一个INT在其主键中。

正如@baraky所说,可以先尝试执行UPDATE,如果影响到零行,则改为执行INSERT。我对此策略的评论是,更新零行不是一个例外-
您必须在UPDATE之后检查“受影响的行数”,才能知道它是否“成功”。

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

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT);

MySQL:

SELECT ROW_COUNT();


 类似资料:
  • 问题内容: 有一种方法可以将此SQL语句转换为NHibernate条件? 我发现NHibernate不支持工会。 问题答案: 因此,我找到了两种解决方案。我会分别执行每个查询,而不是合并结果。这就像一个联合,但不是在数据库中执行,而是在内存中执行。 要么

  • 我想看一下 SQL 标准中的内容 然后我去谷歌搜索了一下 chatGPT 给我的关键字 但是出来的结果,貌似都是和某一款 DB 具体实现相关,而不是一个通用的 sql 标准

  • 问题内容: 我很好奇,想知道各种SQL标准的,一些细节,即,,,等有一个短期和有用的概述维基百科,链接到非常昂贵的文件。为什么这些文件不公开?我可以找到一些开放和免费的信息吗? 请不要发布您从Google找到的链接。我只对权威性文档感兴趣。 问题答案: 从我的一个网站报价: 我们都喜欢开源软件。如果像SQL标准这样的国际标准文档也将开放,那会很好吗? 事实上:它们是! 但是,它们不是免费的,而是公

  • 我有一个连接PL/SQL搜索的代码,就像使用“%”一样,我使用标准来实现 当我运行此代码以显示错误时: 请帮我解决这个问题!

  • 问题内容: 我只是想知道什么是最佳解决方案。 说我有一个规范化的数据库。整个系统的主键是varchar。我想知道的是,我应该将此varchar与int相关联以进行规范化还是将其保留?保留为varchar更简单,但可能会更优化 例如我可以有 否则我可能有 当然,还要添加其他几个一对多的关系。 你们怎么想 哪个更好?为什么? 问题答案: 您真的可以使用名称作为主键吗?几个名字相同的人是否存在很高的风险

  • grails GORM的SQL标准是什么 订单表: 订单ID CustomerID 订购日期 客户表: CustomerID 客户名 联系人姓名 国家 请注意,“Orders”表中的“CustomerID”列指的是“客户”表中的“CustomerID”。上面两个表之间的关系是“CustomerID”列。然后,我们可以创建以下SQL语句(包含一个INNER JOIN),它选择两个表中具有匹配值的记录