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);"
Вы видите ошибку?
Ответы
Ответ 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);