web-dev-qa-db-fra.com

Auto-incrémentation SQLite - Comment insérer des valeurs?

Je génère une table SQLite (en Java):

create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2);

ensuite j'essaye d'ajouter des lignes en utilisant la commande INSERT:

insert into participants values ("bla","blub");

je reçois l'erreur:

Java.sql.SQLException: table participants has 3 columns but 2 values were supplied

Je pensais que l'ID de ligne serait généré automatiquement, mais il semble que je manque quelque chose.


J'ai essayé une autre solution:

PreparedStatement prep = conn.prepareStatement("insert into participants values (?,?,?);");
Integer n = null;
prep.setInt(1,n);
prep.setString(2, "bla");
prep.setString(3, "blub");
prep.addBatch();
prep.executeBatch();

en conséquence, j'ai reçu une exception de pointeur nul à "prep.setInt (1, n);"

Voyez-vous la faute?

42
Anthea

Avez-vous essayé d'indiquer à quels champs du tableau les paramètres que vous transmettez sont censés être liés?

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

Dans votre cas, peut-être quelque chose comme:

INSERT INTO participants(col1, col2) VALUES ("bla","blub");
56
seth

Le moyen le plus simple sans utiliser de noms de colonne sera en utilisant null à la place de auto-incrémentation est comme ceci

insert into table values (null, col1, col2)

si vous avez déjà défini la première colonne comme incrémentation automatique, cela fonctionnera correctement.

19
Padhu

trouvé une solution de travail ici :

PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
prep.setString(2, "bla");
prep.setString(3, "blub");
8
Anthea

La raison de votre erreur est que les insertions SQL s'attendent à ce que vous fournissiez le même nombre de valeurs qu'il y a de colonnes dans la table lorsqu'un spécificateur de colonne n'est pas utilisé.

c'est-à-dire lorsque vous écrivez une requête SQL comme celle-ci:

INSERT INTO TableName VALUES(a1,a2, ...)

.. les valeurs doivent être exactement dans le même ordre que dans la définition du tableau (et aussi le même montant). La raison en est d'éviter toute ambiguïté et de réduire le nombre d'erreurs.

Dans votre cas, vous avez une colonne d'incrémentation automatique pour laquelle vous ne souhaitez pas spécifier de valeur. C'est bien sûr possible, mais en suivant les règles ci-dessus, vous devez spécifier les noms de colonne:

INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);
1
jgauffin