我用Java创建了一个SQLite表:
create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2);
我尝试添加行:
insert into participants values ("bla","blub");
错误:
异常:表参与者有3列,但提供了2个值
我以为ROWID
会自动生成。我尝试了另一种解决方案:
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);
收到空指针异常。你看到错误了吗?
5条答案
按热度按时间enxuqcxy1#
您有没有尝试指出要传递的参数应该与表中的哪些字段相关?
在您的情况下,可能是这样的:
c0vxltue2#
不使用列名的最简单方法是using null代替autoincreament如下所示
如果您已经将第一列设置为自动递增,则它将正常工作。
zhte4eai3#
找到有效的解决方案here:
syqv5f0l4#
错误的原因是,当没有使用列指定符时,SQL INSERT希望您提供与表中的列数相同的值。
即,当您编写如下的SQL查询时:
。。这些值的顺序必须与表定义中的顺序完全相同(并且数量也相同)。这样做的原因是为了避免歧义,减少错误的数量。
在本例中,您有一个自动增量列,您不想为其指定值。这当然是可能的,但遵循上面的规则,您需要指定列名:
vzgqcmou5#
例如,使用**“id”、AUTOINCREMENT和“name”创建Person表**,如下所示:
然后,将空设置为AUTOINCREMENT的**“id”,如下所示。*您可以将NULL设置为“id”,因为“id”有整数主键**,所以id不是NULL**:
现在,您可以插入行,如下所示: