Подтвердить что ты не робот

SQLite автоинкремент - Как вставить значения?

Я создаю таблицу SQLite (в java):

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

Затем я пытаюсь добавить строки с помощью команды INSERT:

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

я получаю ошибку:

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

Я думал, что идентификатор строки будет генерироваться автоматически, но кажется, что я что-то пропустил.


Я попробовал другое решение:

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

В результате я получил исключение с нулевым указателем в "prep.setInt(1, n);"

Вы видите ошибку?

4b9b3361

Ответ 1

Вы пытались указать, в какие поля таблицы должны быть связаны параметры, которые вы передаете?

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

В вашем случае может быть что-то вроде:

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

Ответ 2

Самый простой способ без использования имен столбцов будет с использованием null вместо autoincreament выглядит следующим образом

insert into table values (null, col1, col2)

если вы уже установили первый столбец как автоинкремент, он будет работать нормально.

Ответ 3

найдено рабочее решение здесь:

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

Ответ 4

Причиной вашей ошибки является то, что SQL Inserts ожидает, что вы укажете то же количество значений, что и столбцы в таблице, если спецификатор столбца не используется.

то есть. когда вы пишете SQL-запрос следующим образом:

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

.. значения должны быть в том же порядке, что и в определении таблицы (а также той же суммы). Причина этого заключается в том, чтобы избежать двусмысленности и уменьшить количество ошибок.

В вашем случае у вас есть столбец автоматического увеличения, который вы не хотите указывать для значения. Это, конечно, возможно, но, следуя приведенным выше правилам, вам нужно указать имена столбцов:

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