HSQLDB中的原子INSERT / SELECT

时间:2010-04-09 18:45:05

标签: sql merge hsqldb

我有以下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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

<强>后记

我将此行为报告为错误,并且今天(2010-05-25)已根据hsqldb-Bugs-2989597在hsqldb SVN存储库中修复。 (谢谢,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),这是一个完全可以接受且比上述更清晰的规范。 (我的SQL知识很难简​​化,但对我来说这看起来像个错误。)

原始答案

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

......当没有匹配的插入(“UUID”)值(v.x)

答案 1 :(得分:-1)

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

当数据值和表结构不相同时,它会发生。在空列值中添加显式(NULL)。

就像我创建表

一样

TestCase表:

ID TESTCASEID说明

但你的插入语句你不想为任何测试用例描述添加任何描述然后你必须在insert语句中明确你必须为描述设置空值