更新: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函数检索此整数。
是的,在SQLite中有区别:INTEGER
是一个特殊情况,当数据库不创建单独的主键时,它会重用ROWID
列。当使用INT
(或任何其他内部“映射”到INTEGER
的类型)时,将创建单独的主键。
这就是为什么您会看到为INT
主键创建了sqlite_autoindex
,而对于INTEGER
类型没有创建索引:SQLite重用了内置的索引结构来处理整数主键,使autoindex变得不必要。
因此,INTEGER
主键在存储和性能方面更加经济。
详情请参见此链接。