HSQLDBs 'ON DUPLICATE KEY UPDATE'-功能不像 MYSQL 那样表现?

Posted

技术标签:

【中文标题】HSQLDBs \'ON DUPLICATE KEY UPDATE\'-功能不像 MYSQL 那样表现?【英文标题】:HSQLDBs 'ON DUPLICATE KEY UPDATE'-feature does not behave as in MYSQL?HSQLDBs 'ON DUPLICATE KEY UPDATE'-功能不像 MYSQL 那样表现? 【发布时间】:2020-01-30 10:19:35 【问题描述】:

我正在使用 mysqls ON DUPLICATE KEY UPDATE-feature,它在 MYSQL 数据库上运行时可以正常工作。但是,当我尝试编写针对内存中 HSQLDB 运行的测试时,我会遇到不同的行为。

给定下表:

CREATE TABLE foo (id INT PRIMARY KEY NOT NULL, counter INT);

使用以下插入语句:

INSERT INTO foo(id, counter) VALUES (1, 1) ON DUPLICATE KEY UPDATE counter=counter+1
第一次运行后,计数器为 1。 第二次运行后,计数器为 2。 第三次运行后,计数器仍为 2。这里我希望计数器为 3。(如果我对 MYSQL 运行相同的查询,则为 3)。

这是一个错误,还是我误解了 ON DUPLICATE KEY UPDATE 的工作原理?

有关运行示例,请参阅以下 github-repository:https://github.com/mortenberg80/hsqldbtest

【问题讨论】:

如果INSERT INTO foo(id, counter) VALUES (1, 11) ON DUPLICATE KEY UPDATE counter=counter+1 - 计数器保持2 或变为12 怎么办? HSQLDB - Insert - 没有描述ON DUPLICATE KEY UPDATE 支持。 INSERT INTO foo(id, counter) VALUES (1, 11) ON DUPLICATE KEY UPDATE counter=counter+1,然后计数器变为 12。 hsqldb.org/doc/guide/… 描述了ON DUPLICATE KEY UPDATE-support。 (在 HSQLDB 的更高版本中添加) 您的查询似乎是作为 2 个单独的语句执行的。首先插入一条记录(无条件?还是新记录替换旧记录?),第二个增量插入counter 值。 【参考方案1】:

在遇到col_name 的所有情况下,ON DUPLICATE UPDATE 的初始 HSQLDB 实现都使用 VALUES 列表作为更新源。版本 2.5.1 已增强,可以使用现有表行值作为 col_name 的源,并使用 VALUES 列表作为 VALUES(col_name) 的源。这与 MySQL 的用法相对应。

【讨论】:

以上是关于HSQLDBs 'ON DUPLICATE KEY UPDATE'-功能不像 MYSQL 那样表现?的主要内容,如果未能解决你的问题,请参考以下文章

ON DUPLICATE KEY UPDATE

MySQL INSERT ON DUPLICATE KEY UPDATE

on duplicate key update 怎么确定返回值

mysql ON DUPLICATE KEY UPDATE

INSERT INTO .. ON DUPLICATE KEY更新多行记录

sql UPDATE ON DUPLICATE KEY造成MYSQL死锁现场