INT PRIMARY KEY和INTEGER PRIMARY KEY在SQLite中有什么区别?

45
在为表定义模式时,“INT PRIMARY KEY”和“INTEGER PRIMARY KEY”之间有什么区别吗?当使用“INT PRIMARY KEY”时,会生成“sqlite_autoindex_thing”;当使用“INTEGER PRIMARY KEY”时,会生成“sqlite_sequence”表。它们之间有什么区别?第一和第二种变体可能会有哪些副作用?
3个回答

48

更新:SQLite的ROWID列现在是一个64位整数

在SQLite中,类型为INTEGER PRIMARY KEY的列是ROWID的别名(除了WITHOUT ROWID表),它始终是一个64位有符号整数。

这一切都在SQLite 3文档中有详细解释:

2.0 INTEGER PRIMARY KEY

SQLite中唯一可以指定类型的例外是类型为INTEGER PRIMARY KEY的列。(你必须使用“INTEGER”,而不是“INT”。类型为INT PRIMARY KEY的列与其他任何列一样是无类型的。)INTEGER PRIMARY KEY列必须包含32位有符号整数。任何尝试插入非整数数据的操作将导致错误。

INTEGER PRIMARY KEY列可用于实现AUTOINCREMENT的等效功能。如果您尝试向INTEGER PRIMARY KEY列插入NULL,则该列将实际上填充一个整数,该整数比已存在于表中的最大键值大1。或者,如果最大键值为2147483647,则该列将填充一个随机整数。无论哪种情况,INTEGER PRIMARY KEY列都将被分配一个唯一的整数。您可以使用sqlite_last_insert_rowid() API函数或在随后的SELECT语句中使用last_insert_rowid() SQL函数检索此整数。


32

是的,在SQLite中有区别:INTEGER是一个特殊情况,当数据库创建单独的主键时,它会重用ROWID列。当使用INT(或任何其他内部“映射”到INTEGER的类型)时,将创建单独的主键。

这就是为什么您会看到为INT主键创建了sqlite_autoindex,而对于INTEGER类型没有创建索引:SQLite重用了内置的索引结构来处理整数主键,使autoindex变得不必要。

因此,INTEGER主键在存储和性能方面更加经济。

详情请参见此链接


5
只是要补充一下,尽管答案中已经暗示了。您创建的 INTEGER PRIMARY KEY 列只是 ROWID _ROWID_ OID 的别名。如果添加了 AUTOINCREMENT 关键字,则插入的每个新记录都是上一个 ROWID 的增量1,并且最后的 ROWID 由名为 sqlite_sequence 的sqlite内部表保留。

请参见链接此处此处

另一方面,如果将列声明为 INT PRIMARY KEY ,则sqlite会创建自动索引(因此为 sqlite_autoindex ),以跟踪插入到主键中的值,以确保它是唯一的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接