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 那样表现?的主要内容,如果未能解决你的问题,请参考以下文章