web-dev-qa-db-ja.com

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

行IDは自動的に生成されると思っていましたが、何かを見逃しているようです。


私は別の解決策を試しました:

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);」でヌルポインター例外を受け取りました。

障害がありますか?

42
Anthea

渡すパラメータがテーブルのどのフィールドに関連することになっているのかを示してみましたか?

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

あなたの場合、次のようなものでしょう:

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

列名を使用しない最も簡単な方法は、 autoincreament の代わりに sing null になります

insert into table values (null, col1, col2)

すでに最初の列を自動インクリメントとして設定している場合は、正常に機能します。

19
Padhu

実用的なソリューションを見つけました こちら

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

エラーの原因は、列挿入子が使用されていない場合、テーブルに列があるのと同じ数の値を提供することをSQL挿入が期待しているためです。

つまり、次のようなSQLクエリを作成する場合:

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

..値は、テーブル定義とまったく同じ順序(および同じ量)でなければなりません。これは、あいまいさを避け、エラーの数を減らすためです。

あなたの場合、値を指定したくない自動インクリメント列があります。もちろんそれは可能ですが、上記のルールに従って列名を指定する必要があります。

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