INT PRIMARY KEY和INTEGER PRIMARY KEY SQLite之间的区别

时间:2013-11-29 15:53:10

标签: sql sqlite

在为表定义架构时,INT PRIMARY KEYINTEGER PRIMARY KEY之间是否有任何区别? 当使用int主键时,我生成了sqlite_autoindex thing ; 当整数主键时,我生成了sqlite_sequence表。 有什么不同?哪种副作用可以有第一种和第二种变体?

3 个答案:

答案 0 :(得分:38)

更新:SQLite的ROWID列现在是64-bit integer

  

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

所有这些都在SQLite 3 documentation中解释:

  

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,则该列实际上将填充一个比表中已有的最大键大的整数。或者,如果最大的键是2147483647,则该列将填充随机整数。无论哪种方式,INTEGER PRIMARY KEY列都将被分配一个唯一的整数。您可以使用sqlite_last_insert_rowid()API函数或在后续SELECT语句中使用last_insert_rowid()SQL函数来检索此整数。

答案 1 :(得分:21)

是的,存在差异:INTEGER是SQLite中的一个特例,当数据库创建单独的主键时,但重新使用ROWID列。当您使用INT(或在内部“映射”到INTEGER的任何其他类型)时,会创建一个单独的主键。

这就是为什么你看到为sqlite_autoindex主键创建INT而没有为类型INTEGER创建索引的原因:SQLite重用整数的内置索引结构主键,无需渲染自动索引。

这就是INTEGER主键在存储和性能方面更经济的原因。

请参阅this link for details

答案 2 :(得分:3)

只是添加虽然已经隐含在这里的答案。您创建的INTEGER PRIMARY KEY列只是ROWID_ROWID_OID的别名。如果添加了AUTOINCREMENT关键字,则插入的每个新记录都是最后ROWID的1的增量,最后ROWID由名为sqlite_sequence的sqlite内部表保存。

请参阅链接herehere

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