SQLite 自动增量 - 如何插入值?

Posted

技术标签:

【中文标题】SQLite 自动增量 - 如何插入值?【英文标题】:SQLite autoincrement - How to insert values? 【发布时间】:2012-01-05 06:05:59 【问题描述】:

我生成了一个 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);”处收到了一个空指针异常

你看出错了吗?

【问题讨论】:

【参考方案1】:

您是否尝试过指示您传递的参数应该与表的哪些字段相关?

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

在你的情况下可能是这样的:

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

【讨论】:

我认为这可行,我找到了另一种好方法并编辑了问题!谢谢! 这是正确的方法。这也不是特定于 SQLite。 如果您正在执行架构迁移并使用 select 语句进行插入,您可以执行 insert into participants(col1, col2) select col1, col2 from t1_backup;【参考方案2】:

不使用列名的最简单方法是 using null 代替 autoincreament 是这样的

insert into table values (null, col1, col2)

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

【讨论】:

【参考方案3】:

找到了一个可行的解决方案here:

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

【讨论】:

【参考方案4】:

错误的原因是,当不使用列说明符时,SQL 插入希望您提供与表中的列相同数量的值。

即当您编写这样的 SQL 查询时:

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

.. 值的顺序必须与表定义中的顺序完全相同(并且数量也相同)。这样做的原因是为了避免歧义并减少错误的数量。

在您的情况下,您有一个不想为其指定值的自动增量列。这当然是可能的,但是按照上面的规则你需要指定列名:

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

【讨论】:

以上是关于SQLite 自动增量 - 如何插入值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLite 的插入查询中返回自动增量值?

SQLite PRIMARY 键自动增量不起作用

是否可以为使用 python 的 sqlite3 中的主键自动增量列选择第一个值?

linq2db Sqlite Insert之后获取插入的自增量ID值

Python将字典插入sqlite3

如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?