在 为表定义模式时INT PRIMARY KEY
和之间有什么区别 INTEGER PRIMARY KEY
吗?当使用int主键时,我得到了生成的sqlite_autoindex
东西 ; 当整数主键,我得到sqlite_sequence
表生成.有什么不同?什么副作用可以有第一和第二变种?
更新: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,则该列实际上将填充一个比表中已有的最大键大的整数.或者,如果最大的键是2147483647,则该列将填充随机整数.无论哪种方式,INTEGER PRIMARY KEY列都将被分配一个唯一的整数.您可以使用sqlite_last_insert_rowid()API函数或在后续SELECT语句中使用last_insert_rowid()SQL函数来检索此整数.
是的,是有区别的:INTEGER
在SQLite的特殊情况下,当数据库并没有单独创建一个主键,但重用ROWID
列代替.当您使用INT
(或在INTEGER
内部"映射"的任何其他类型)时,会创建单独的主键.
这就是为什么你看到为主键sqlite_autoindex
创建的原因INT
,并且没有为类型创建索引INTEGER
:SQLite重用整数主键的内置索引结构,使得不需要自动索引.
这就是为什么INTEGER
主键在存储和性能方面都更经济.
请参阅此链接了解详情.