2010-04-09 12 views
1

je la table hsqldb suivante, où je la carte UUID aux ID incrémentée auto:atomique INSERT/SELECT dans HSQLDB

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

Créer commande:

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

Pour ajouter de nouvelles paires simultanément, je veux utiliser l'instruction atomique MERGE INTO. Donc, mon (préparé) déclaration ressemble à ceci:

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

Quand j'exécuter l'instruction (réglage de l'espace réservé à juste titre), je reçois toujours un

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

Pourriez-vous s'il vous plaît me donner un indice, qu'est-ce qui ne va pas ici?

Merci d'avance.

+1

Est-ce l'erreur * exact * et * complete *? (Google n'a pas d'autres occurrences sur ce texte que cette question.) '' "Table" et '" ID_MAP "' deux tables différentes? Ce n'est pas clair à partir de votre question ... – pilcrow

+0

Merci pour cet indice. Oui, ils sont pareils. Je voulais juste les renommer afin de simplifier la question. Je les ai changé à nouveau maintenant. C'est une table, appelée ici 'mytable' –

+0

Pour la postérité, HyperSQL a reconnu le bogue dans 2.0.0-rc9 et corrigera. Voir https://sourceforge.net/projects/hsqldb/forums/forum/73674/topic/3681460 – pilcrow

Répondre

2

Epilogue

Je signalé ce comportement comme un bug, et il est aujourd'hui (2010-05-25) fixé dans le dépôt SVN hsqldb, par hsqldb-Bugs-2989597. (Merci, hsqldb!)

Mise à jour Réponse

d'un Neat! Voici ce que je suis arrivé à travailler sous HSQLDB 2.0.0rc9, qui prend en charge la syntaxe et le message d'erreur que vous avez posté:

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" :(

Remarque, je ne pas convaincre 2.0.0rc9 d'accepter ... THEN INSERT (UUID) VALUES (x), qui est IIUC un tout à fait acceptable et plus claire spécification que ci-dessus. (Ma connaissance de SQL est à peine compendious, mais cela ressemble à un bug pour moi.)

originale Réponse

Vous semblez insérez une valeur unique (1-tuple) dans une table avec plus de une colonne. Peut-être que vous pouvez modifier la fin de votre déclaration comme suit:

... QUAND ASSORTIE INSERT PAS (« UUID ») VALUES (v.x)

+0

Je l'ai déjà essayé auparavant, mais ce n'est pas un problème car la fonction HSQLDBs permet de définir automatiquement des valeurs non listées. 'GENERE PAR DEFAUT COMME IDENTIFIE PRIMARY KEY'. L'erreur persiste. –

+0

Merci beaucoup! –

+0

Qu'est-ce que "DUAL" ici? – zengr

-1

je suis arrivé mêmes problèmes, mais résoudre en quelques minutes.

Cela se produit lorsque datavalues ​​et la structure de la table ne sont pas identiques.Add explicite (NULL) dans votre valeur de colonne vide.

Comme je l'ai créé la table

table TestCase:

ID TESTCASEID DESCRIPTION

mais votre déclaration d'insertion vous donot voulez ajouter une description pour une description testcase alors vous devez Explicite dans l'instruction d'insertion vous avoir à définir une valeur nulle pour la description