Автоинкремент SQLite - Как вставить значения? - PullRequest
41 голосов
/ 24 ноября 2011

Я создаю таблицу 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);"

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

Ответы [ 4 ]

56 голосов
/ 24 ноября 2011

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

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

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

INSERT INTO participants(col1, col2) VALUES ("bla","blub");
18 голосов
/ 24 сентября 2015

Самый простой способ без использования имен столбцов будет с использованием нуля вместо автоинкрементация похожа на это

insert into table values (null, col1, col2)

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

8 голосов
/ 24 ноября 2011

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

PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
prep.setString(2, "bla");
prep.setString(3, "blub");
1 голос
/ 28 августа 2015

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

, то есть когда вы пишете запрос SQL, напримерthis:

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

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

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

INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...