2011-11-24 81 views
33

que generar una tabla SQLite (en Java):Autoincrement SQLite - ¿Cómo insertar valores?

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

después intento agregar filas usando el comand INSERT:

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

me sale el error:

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

I pensé que la identificación de la fila se generaría automáticamente, pero parece que extraño cualquier cosa.


I intentaron otra solución:

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(); 

como resultado he recibido una excepción de puntero nulo en "prep.setInt (1, n);"

¿Ves la falla?

Respuesta

48

¿Ha intentado indicar a qué campos de la tabla se supone que están relacionados los parámetros que está pasando?

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

En su caso tal vez algo como:

INSERT INTO participants(col1, col2) VALUES ("bla","blub"); 
+0

Creo que eso funcionaría, encontré otra buena manera y edité la pregunta. Gracias ! – Anthea

+1

Esta es la forma correcta. Esto tampoco es específico de SQLite. –

+0

Si está haciendo una migración de esquema y usa una instrucción de selección para su inserción, puede hacer 'insertar en participantes (col1, col2) seleccionar col1, col2 de t1_backup;' – mlissner

7

encontró una solución de trabajo here:

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

La razón para el error es que SQL inserciones espera que proporcione el mismo número de valores ya que hay columnas en la tabla cuando no se utiliza un especificador de columna.

es decir, cuando se escribe una consulta SQL como esto:

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

.. los valores tienen que estar en el mismo orden que en la definición de la tabla (y también la misma cantidad). El motivo es evitar la ambigüedad y reducir el número de errores.

En su caso, tiene una columna de incremento automático para la que no desea especificar un valor. Esto es posible, por supuesto, pero siguiendo las reglas anteriores es necesario especificar nombres de columna:

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

La manera más fácil sin necesidad de utilizar nombres de columna será using null en el lugar de autoincreament es así

insert into table values (null, col1, col2) 

si ya ha configurado la primera columna como autoincrement, funcionará bien.

Cuestiones relacionadas