ROWID INTEGER PRIMARY KEY AUTOINCREMENT – ¿Cómo insertar valores?

2 minutos de lectura

Avatar de usuario de Anthea
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

Avatar de usuario de Padhu
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.

Avatar de usuario de Anthea
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 - Avatar de usuario de Kazuya Ito
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  │
└────┴──────┘

¿Ha sido útil esta solución?