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 那样表现?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL INSERT ON DUPLICATE KEY UPDATE
on duplicate key update 怎么确定返回值