sqlite ROWID整数主键AUTOINCREMENT-如何插入值?

vuv7lop3  于 2022-11-15  发布在  SQLite
关注(0)|答案(5)|浏览(133)

我用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);收到空指针异常。你看到错误了吗?

enxuqcxy

enxuqcxy1#

您有没有尝试指出要传递的参数应该与表中的哪些字段相关?

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

在您的情况下,可能是这样的:

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

c0vxltue2#

不使用列名的最简单方法是using null代替autoincreament如下所示

insert into table values (null, col1, col2)

如果您已经将第一列设置为自动递增,则它将正常工作。

zhte4eai

zhte4eai3#

找到有效的解决方案here

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

syqv5f0l4#

错误的原因是,当没有使用列指定符时,SQL INSERT希望您提供与表中的列数相同的值。
即,当您编写如下的SQL查询时:

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

。。这些值的顺序必须与表定义中的顺序完全相同(并且数量也相同)。这样做的原因是为了避免歧义,减少错误的数量。
在本例中,您有一个自动增量列,您不想为其指定值。这当然是可能的,但遵循上面的规则,您需要指定列名:

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

vzgqcmou5#

例如,使用**“id”AUTOINCREMENT“name”创建Person表**,如下所示:

CREATE TABLE person (    -- Here
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  name TEXT
);

然后,将设置为AUTOINCREMENT的**“id”,如下所示。*您可以将NULL设置为“id”,因为“id”整数主键**,所以id不是NULL**:

INSERT INTO person VALUES (NULL, "John"), (NULL, "Tom");

现在,您可以插入行,如下所示:

sqlite> SELECT * FROM person;
┌────┬──────┐
│ id │ name │
├────┼──────┤
│ 1  │ John │
│ 2  │ Tom  │
└────┴──────┘

相关问题