【发布时间】:2018-09-28 08:26:19
【问题描述】:
在为表定义架构时,INT PRIMARY KEY 和 INTEGER PRIMARY KEY 之间有什么区别吗?
当使用 int 主键时,我生成了sqlite_autoindex thing;
当整数主键时,我得到了sqlite_sequence 表生成。
有什么不同?第一种和第二种变体会有哪些副作用?
【问题讨论】:
在为表定义架构时,INT PRIMARY KEY 和 INTEGER PRIMARY KEY 之间有什么区别吗?
当使用 int 主键时,我生成了sqlite_autoindex thing;
当整数主键时,我得到了sqlite_sequence 表生成。
有什么不同?第一种和第二种变体会有哪些副作用?
【问题讨论】:
更新:SQLite 的 ROWID 列现在是 64-bit integer:
在 SQLite 中,类型为 INTEGER PRIMARY KEY 的列是 ROWID 的别名(除了 WITHOUT ROWID 表),它始终是 64 位有符号整数。
SQLite 3 documentation中都有解释:
2.0 整数主键
SQLite 无类型的一个例外是类型为 INTEGER PRIMARY KEY 的列。 (并且您必须使用“INTEGER”而不是“INT”。INT PRIMARY KEY 类型的列与其他列一样是无类型的。) INTEGER PRIMARY KEY 列必须包含一个 32 位有符号整数。任何插入非整数数据的尝试都会导致错误。
INTEGER PRIMARY KEY 列可用于实现等价于 AUTOINCREMENT。如果您尝试将 NULL 插入 INTEGER PRIMARY KEY 列,则该列实际上将填充一个比表中已存在的最大键大 1 的整数。或者如果最大的键是 2147483647,那么该列将填充一个随机整数。无论哪种方式,INTEGER PRIMARY KEY 列都将被分配一个唯一的整数。您可以使用 sqlite_last_insert_rowid() API 函数或在后续 SELECT 语句中使用 last_insert_rowid() SQL 函数来检索此整数。
【讨论】:
是的,有区别:INTEGER 是 SQLite 中的一种特殊情况,当数据库不创建单独的主键,而是重用 ROWID 列时。当您使用 INT(或任何其他在内部“映射”到 INTEGER 的类型)时,会创建一个单独的主键。
这就是为什么您会看到为INT 主键创建了sqlite_autoindex,而没有为INTEGER 类型的一个创建索引:SQLite 为整数主键重用了内置索引结构,从而呈现自动索引没必要。
这就是为什么INTEGER 主键在存储和性能方面更经济的原因。
【讨论】: