Атомная INSERT / SELECT в HSQLDB - PullRequest
       23

Атомная INSERT / SELECT в HSQLDB

1 голос
/ 09 апреля 2010

У меня есть следующая таблица hsqldb, в которой я сопоставляю UUID с автоматически увеличенными идентификаторами:

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 ]

2 голосов
/ 16 апреля 2010

Эпилог

Я сообщил об этом поведении как об ошибке, и сегодня (2010-05-25) оно исправлено в репозитории SVN hsqldb, для 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)

0 голосов
/ 01 октября 2013

У меня такие же проблемы, но они решаются за несколько минут.

Это происходит, когда значения данных и структура таблицы не совпадают. Добавьте явное (NULL) значение пустого столбца.

Как я создал таблицу

Таблица TestCase:

ID TESTCASEID ОПИСАНИЕ

но ваше предложение вставки, которое вы не хотите добавлять для описания любого тестового примера, должно быть объяснено, тогда вы должны указать в заявлении вставки, что вы должны установить нулевое значение для описания

...