在为表定义架构时,INT PRIMARY KEY
和INTEGER PRIMARY KEY
之间是否有任何区别?
当使用int主键时,我生成了sqlite_autoindex
thing ;
当整数主键时,我生成了sqlite_sequence
表。
有什么不同?哪种副作用可以有第一种和第二种变体?
答案 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
主键在存储和性能方面更经济的原因。
答案 2 :(得分:3)