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
请给我一个提示,这里出了什么问题?
提前致谢。
【问题讨论】:
这是 exact 和 complete 错误吗? (除了这个问题,谷歌对该文本没有任何点击。)"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 中的原子插入/选择的主要内容,如果未能解决你的问题,请参考以下文章