Antea
Creé una tabla SQLite en Java:
create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2);
Traté de agregar filas:
insert into participants values ("bla","blub");
Error:
java.sql.SQLException: los participantes de la tabla tienen 3 columnas pero se proporcionaron 2 valores
Pensé ROWID
se generaría automáticamente. Probé 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();
Recibí una excepción de puntero nulo en prep.setInt(1,n);
. ¿Ves la falla?
¿Ha intentado indicar con 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 tu caso tal vez algo como:
INSERT INTO participants(col1, col2) VALUES ("bla","blub");
-
Si está realizando una migración de esquema y utilizando una declaración de selección para su inserción, puede hacer
insert into participants(col1, col2) select col1, col2 from t1_backup;
– mlissner
25/09/2015 a las 17:56
Padhu
La forma más fácil sin usar nombres de columna será usando nulo en lugar de autoincremento es así
insert into table values (null, col1, col2)
si ya configuró la primera columna como incremento automático, funcionará bien.
Antea
Encontré una solución de trabajo aquí:
PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
prep.setString(2, "bla");
prep.setString(3, "blub");
El motivo de su error es que las inserciones de SQL esperan que proporcione la misma cantidad de valores que columnas en la tabla cuando no se usa un especificador de columna.
es decir, cuando escribe una consulta SQL como esta:
INSERT INTO TableName VALUES(a1,a2, ...)
.. los valores tienen que estar exactamente en el mismo orden que en la definición de la tabla (y también la misma cantidad). La razón de esto 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. Por supuesto, eso es posible, pero siguiendo las reglas anteriores, debe especificar los nombres de las columnas:
INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);
Kai-Kazuya Ito
Por ejemplo, creas tabla “persona” con “identificación” con AUTOINCREMENTO y “nombre” Como se muestra abajo:
CREATE TABLE person ( -- Here
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name TEXT
);
Luego, establezca NULO a “identificación” de AUTOINCREMENTO Como se muestra abajo. * Puedes configurar NULO a “identificación” que tiene NO NULO porque “identificación” posee CLAVE PRIMARIA ENTERA:
INSERT INTO person VALUES (NULL, "John"), (NULL, "Tom");
Ahora, puede insertar filas como se muestra a continuación:
sqlite> SELECT * FROM person;
┌────┬──────┐
│ id │ name │
├────┼──────┤
│ 1 │ John │
│ 2 │ Tom │
└────┴──────┘