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);」でヌルポインター例外を受け取りました。
障害がありますか?
渡すパラメータがテーブルのどのフィールドに関連することになっているのかを示してみましたか?
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
あなたの場合、次のようなものでしょう:
INSERT INTO participants(col1, col2) VALUES ("bla","blub");
列名を使用しない最も簡単な方法は、 autoincreament の代わりに sing null になります
insert into table values (null, col1, col2)
すでに最初の列を自動インクリメントとして設定している場合は、正常に機能します。
実用的なソリューションを見つけました こちら :
PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
prep.setString(2, "bla");
prep.setString(3, "blub");
エラーの原因は、列挿入子が使用されていない場合、テーブルに列があるのと同じ数の値を提供することをSQL挿入が期待しているためです。
つまり、次のようなSQLクエリを作成する場合:
INSERT INTO TableName VALUES(a1,a2, ...)
..値は、テーブル定義とまったく同じ順序(および同じ量)でなければなりません。これは、あいまいさを避け、エラーの数を減らすためです。
あなたの場合、値を指定したくない自動インクリメント列があります。もちろんそれは可能ですが、上記のルールに従って列名を指定する必要があります。
INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);