Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL标准UPSERT调用_Mysql_Sql_Hsqldb_Upsert - Fatal编程技术网

Mysql SQL标准UPSERT调用

Mysql SQL标准UPSERT调用,mysql,sql,hsqldb,upsert,Mysql,Sql,Hsqldb,Upsert,我正在寻找标准的SQL“UPSERT”语句。如果存在,则只调用一次insert和update 我正在寻找一个工作,高效和跨平台的电话 我看到了合并,插入,替换,插入。。重复更新时,但没有符合要求的语句 顺便说一句,我使用MYSQL和HSQLDB进行单元测试。我知道HSQLDB是有限的,可能无法满足我的需要,但即使没有它,我也找不到标准的方法。 现在,只有MYSQL和HSQLDB也足够了 我四处找了一会儿,找不到答案 我的桌子: CREATE TABLE MY_TABLE ( MY_KEY v

我正在寻找标准的SQL“
UPSERT
”语句。如果存在,则只调用一次insert和update

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


我看到了
合并
插入
替换
插入。。重复更新时
,但没有符合要求的语句

顺便说一句,我使用MYSQL和HSQLDB进行单元测试。我知道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)
);

有什么想法吗?

在单个命令中执行upsert的语法因RDBMS而异

  • MySQL
  • HSQLDB
  • 博士后


如果需要跨平台解决方案,则需要使用多个命令。首先检查现有行,然后根据需要有条件地插入或更新。

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

  • 启动事务
  • 选择。。。更新
  • 如果SELECT找到行,则更新
  • 否则,请插入
  • 承诺
  • MySQL不支持ANSI SQL MERGE语句。它支持在重复密钥更新时替换和插入。更多信息,请参见我的答案


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

    正如@baraky所说的,可以先尝试更新,如果这影响到零行,那么就进行插入。我对这个策略的评论是,更新零行并不是一个例外——您必须在更新之后检查“受影响的行数”,以了解它是否“成功”

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

    HSQLDB:

    CALL DIAGNOSTICS(ROW_COUNT);
    
    MySQL:

    SELECT ROW_COUNT();
    

    INSERT。。重复更新时
    mYSQL
    中的键。你能显示一些记录或者表结构吗?是的,但它仅在MYSQL中受支持。HSQLDB和所有其他数据库都不使用它……有一个ANSI merge(),但它并没有在所有DBMS中实现。所以对通用命令没有希望。MYSQL不支持它:(以防万一你可以使用ruby,my(警告自我提升)库将自动定义MySQL和PASGRESE中的UpSert函数,它可以被称为单个命令。包括广泛的测试。我不想使用多个命令。测试和DEV如何运行相同的代码?我仍然建议使用条件代码来做它。如果您不这样做,那么考虑标准化测试A。nd dev环境使用相同的RDBMS。@baraky:如果您想支持多个DBMS,您永远无法用在所有DBMS上运行的语句解决所有问题。请准备好使用特定于DBMS的语句。其他一切都将失败。或者执行INSERT、catch SQLException,如果它违反完整性约束,则执行更新实际上这就是(几乎)我要做的-我要更新,捕捉异常(因为更新对我来说是常见的情况),如果失败就插入。Thanx!