HSQLDB 中的原子插入/选择

Posted

技术标签:

【中文标题】HSQLDB 中的原子插入/选择【英文标题】:Atomic INSERT/SELECT in HSQLDB 【发布时间】:2010-04-09 18:45:04 【问题描述】:

我有以下 hsqldb 表,其中我将 UUID 映射到自动递增的 ID:

SHORT_ID (BIG INT, PK, auto incremented) | UUID (VARCHAR, unique)

创建命令:

CREATE TABLE mytable (SHORT_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, UUID VARCHAR(36) UNIQUE)

为了同时添加新的对,我想使用原子MERGE INTO 语句。所以我的(准备好的)声明看起来像这样:

MERGE INTO mytable USING (VALUES(CAST(? AS VARCHAR(36)))) AS v(x) ON mytable.UUID = v.x WHEN NOT MATCHED THEN INSERT VALUES v.x

当我执行语句(正确设置占位符)时,我总是得到一个

Caused by: org.hsqldb.HsqlException: row column count mismatch

请给我一个提示,这里出了什么问题?

提前致谢。

【问题讨论】:

这是 exactcomplete 错误吗? (除了这个问题,谷歌对该文本没有任何点击。)"table""ID_MAP" 是两个不同的表吗?从您的问题中不清楚... 感谢您的提示。是的,它们是一样的。我只是想重命名它们以简化问题。我现在又改了。这是一张桌子,这里叫mytable HyperSQL 承认 2.0.0-rc9 中的 bug 并将修复。见sourceforge.net/projects/hsqldb/forums/forum/73674/topic/… 【参考方案1】:

结语

我将此行为报告为错误,今天 (2010-05-25) 已在 hsqldb SVN 存储库中修复,每个 hsqldb-Bugs-2989597。 (谢谢,hsqldb!)

更新答案

整洁!这是我在HSQLDB 2.0.0rc9 下工作的内容,它支持您发布的语法和错误消息:

MERGE INTO mytable
   USING (SELECT 'a uuid' FROM dual) AS v(x) -- my own "DUAL" table
   ON (mytable.UUID = v.x)
   WHEN NOT MATCHED THEN INSERT
     VALUES (NULL, x)                        -- explicit NULL for "SHORT_ID" :(

注意,我可以说服 2.0.0rc9 接受 ... THEN INSERT (UUID) VALUES (x),这是 IIUC 一个完全可以接受且比上述更清晰的规范。 (我的 SQL 知识并不简明,但这对我来说似乎是一个错误。)

原答案

您似乎正在将单个值(一个 1 元组)插入包含多个列的表中。也许您可以将语句的结尾修改为:

...当不匹配时插入(“UUID”)值(v.x)

【讨论】:

我之前已经尝试过,但是这没有问题,因为 HSQLDB 能够自动设置未列出的值 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY。错误仍然存​​在。 @zengr,DUAL 表是与 Oracle 关联的特殊单行表。在此网站上搜索有关它的问题。【参考方案2】:

我遇到了同样的问题,但几分钟内就解决了。

当数据值和表结构不同时会发生这种情况。在空列值中添加显式 (NULL)。

就像我创建了表

TestCase 表:

ID TESTCASEID 描述

但是您的插入语句您不想为任何测试用例描述添加任何描述,那么您必须在插入语句中明确说明您必须为描述设置空值

【讨论】:

以上是关于HSQLDB 中的原子插入/选择的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 如果不存在则插入,如果存在则更新

HSQLDB 只是插入中的时间值

使用 HSQLDB 选择 INTO

在 HSQLDB 中选择 100+ 百万行

使用 JAVA 线程在 hsqldb 中进行并发访问

条件插入作为 HSQLDB 1.8 中的单个数据库事务?