假设我有一个表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保持不变?
autoincrement
和autoincrement not null
之间有什么区别?官方文档说它会降低性能,数据库运行缓慢。是否必须与integer primary key
一起编写?
我已经阅读了很多stackoverflow答案,并且还阅读了SQLite Official Documentation,但我无法得到它。
答案 0 :(得分:4)
假设id
是INTEGER PRIMARY KEY
列的名称。
如果更新一行,它将永远不会更改其ID,因为它仍然是同一行。 (这是整个更新的重点)。
关于新ID的创建,所有内容都在您链接的文档中:
相关部分:
在INSERT上,如果未明确给出ROWID或INTEGER PRIMARY KEY列的值,则它将自动填充未使用的整数,通常是当前正在使用的最大ROWID之一。
没有严格的规则,它可以依赖于实现。通常它等于select max(id)+1
。在你的情况6中,但是如果删除第5行,则可以重用id 5。 (但不要依赖于此)。
如果列的类型为INTEGER PRIMARY KEY AUTOINCREMENT(...),则为新行选择的ROWID至少比同一个表中以前存在的最大ROWID大一个。如果表之前从未包含任何数据,则使用ROWID为1。
将NOT NULL
添加到AUTOINCREMENT
因此毫无意义。
在您的情况下,无论您在此之前删除了多少行,下一个ID都是6。
答案 1 :(得分:1)
如果您只使用integer primary key
,那么任何插入都会使用当前最大值ROWID
(id
实际上是别名)加一。因此,删除行3
并插入新行将使用6
。但是,如果您要删除行5
(将最大ROWID
保留在4
),则新插入的行的ID将为5
。
如果你关心id没有被重用,那么你需要autoincrement
。这种情况较慢(并建议除非您需要它)的原因是有史以来最大的值保存在内部表中。然后,插入必须读取/更新此内部表作为其操作的一部分。如果使用autoincrement
,则删除3
或5
后的插入会创建一个ID为6
的行。
行4
的正常更新会使id保持不变,除非您使用insert or replace
有效删除行并插入新行。这样的插入符合上述相同的规则。