SQLite数据库如何更新主键ID?

时间:2015-02-06 17:06:57

标签: android database sqlite

假设我有一个表contacts

  id        Name            Contact_No
-----------------------------------------
   1        abc                12345
   2        lmn                56784
   3        pqr                83654
   4        uvw                17637
   5        xyz                98345

如果我从第3行删除第3行,那么删除行后面的id行会是什么?

如果我更新第4行,更新数据库后是否会给新的id或第4行的ID保持不变?

autoincrementautoincrement not null之间有什么区别?官方文档说它会降低性能,数据库运行缓慢。是否必须与integer primary key一起编写?

我已经阅读了很多stackoverflow答案,并且还阅读了SQLite Official Documentation,但我无法得到它。

2 个答案:

答案 0 :(得分:4)

假设idINTEGER PRIMARY KEY列的名称。

如果更新一行,它将永远不会更改其ID,因为它仍然是同一行。 (这是整个更新的重点)。

关于新ID的创建,所有内容都在您链接的文档中:

相关部分:

没有AUTOINCREMENT

  

在INSERT上,如果未明确给出ROWID或INTEGER PRIMARY KEY列的值,则它将自动填充未使用的整数,通常是当前正在使用的最大ROWID之一。

没有严格的规则,它可以依赖于实现。通常它等于select max(id)+1。在你的情况6中,但是如果删除第5行,则可以重用id 5。 (但不要依赖于此)。

使用AUTOINCREMENT

  

如果列的类型为INTEGER PRIMARY KEY AUTOINCREMENT(...),则为新行选择的ROWID至少比同一个表中以前存在的最大ROWID大一个。如果表之前从未包含任何数据,则使用ROWID为1。

NOT NULL添加到AUTOINCREMENT因此毫无意义。

在您的情况下,无论您在此之前删除了多少行,下一个ID都是6。

答案 1 :(得分:1)

如果您只使用integer primary key,那么任何插入都会使用当前最大值ROWIDid实际上是别名)加一。因此,删除行3并插入新行将使用6。但是,如果您要删除行5(将最大ROWID保留在4),则新插入的行的ID将为5

如果你关心id没有被重用,那么你需要autoincrement。这种情况较慢(并建议除非您需要它)的原因是有史以来最大的值保存在内部表中。然后,插入必须读取/更新此内部表作为其操作的一部分。如果使用autoincrement,则删除35后的插入会创建一个ID为6的行。

4的正常更新会使id保持不变,除非您使用insert or replace有效删除行并插入新行。这样的插入符合上述相同的规则。