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

Sas*_*kia 33 sql sqlite

在 为表定义模式时INT PRIMARY KEY和之间有什么区别 INTEGER PRIMARY KEY吗?当使用int主键时,我得到了生成的sqlite_autoindex 东西 ; 当整数主键,我得到sqlite_sequence表生成.有什么不同?什么副作用可以有第一和第二变种?

Rog*_*and 41

更新: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函数来检索此整数.


das*_*ght 22

是的,是有区别的:INTEGER在SQLite的特殊情况下,当数据库并没有单独创建一个主键,但重用ROWID列代替.当您使用INT(或在INTEGER内部"映射"的任何其他类型)时,会创建单独的主键.

这就是为什么你看到为主键sqlite_autoindex创建的原因INT,并且没有为类型创建索引INTEGER:SQLite重用整数主键的内置索引结构,使得不需要自动索引.

这就是为什么INTEGER主键在存储和性能方面都更经济.

请参阅此链接了解详情.


Edp*_*per 5

只是在此处的答案中添加尽管已经暗示。在INTEGER PRIMARY KEY您创建列仅仅是一个别名ROWID_ROWID_OID。如果AUTOINCREMENT添加关键字,则插入的每条新记录都是最后一条记录的 1 增量,最后ROWID一条ROWID由名为sqlite_sequence.

请参阅此处此处的链接

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