澄清sqlite的insert语句返回的row_id

时间:2012-04-28 13:22:17

标签: android sqlite

好的,我们看到here SQLite insert语句返回名为row id的内容。

插入时,我们知道SQLite喜欢名为ID的主键列,如果插入的ID值为空,则会自动生成适当的值。

缺少的胶水是确认row id方法返回的SQLiteDatabase.insert()实际上是行的主键自动生成的值。 (这不是Oracle的情况......)

请问有人确认或否认吗?

解决

好的,所以来自@sixfeetsix发布的链接:

  

SQLite表中的每个条目都有一个唯一的64位有符号整数键,称为“rowid”。 rowid始终作为未声明的列提供...如果表具有INTEGER PRIMARY KEY类型的列,则该列是rowid的另一个别名。

然后他的auto-increment链接会验证row_id和自动增量值是否相同。

这是一个包装,谢谢,伙计们!

2 个答案:

答案 0 :(得分:4)

Android insert(...) method返回:

  

新插入行的行ID,如果发生错误,则返回-1

这可能会让外行人感到困惑,但row id in sqlite或者是integer primary key字段,或者在没有字段的情况下,是一个名为ROWID的64位未声明的列。

因此,当您在auto-increment field中插入NULL或没有值时,将返回生成的值。

答案 1 :(得分:2)

它们是两个不同的东西。

insert()返回的row_id是插入行的唯一标识符,它是SQLite内部使用的标识符。

另一方面,您可以在表格中添加一个代表您的业务关键字的列,声明:

_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT

因此,SQLite将为您生成该列的值。

据我所知,SQLite中没有这样的函数,比如SQL Server的SCOPE_IDENTITY()(返回最后一个自动增量插入的id)。

所以,如果你做了一个插入并需要检索自动生成的id,你可以这样做:

SELECT seq FROM sqlite_sequence WHERE name='tableName'

但请注意,这在并发场景中并不安全。