【问题标题】:Difference between INT PRIMARY KEY and INTEGER PRIMARY KEY SQLiteINT PRIMARY KEY 和 INTEGER PRIMARY KEY SQLite 的区别
【发布时间】:2018-09-28 08:26:19
【问题描述】:

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

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      是的,有区别:INTEGER 是 SQLite 中的一种特殊情况,当数据库创建单独的主键,而是重用 ROWID 列时。当您使用 INT(或任何其他在内部“映射”到 INTEGER 的类型)时,会创建一个单独的主键。

      这就是为什么您会看到为INT 主键创建了sqlite_autoindex,而没有为INTEGER 类型的一个创建索引:SQLite 为整数主键重用了内置索引结构,从而呈现自动索引没必要。

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

      this link for details

      【讨论】:

        【解决方案3】:

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

        见链接herehere

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

        【讨论】:

          猜你喜欢
          • 2011-04-20
          • 2012-11-20
          • 2018-01-05
          • 1970-01-01
          • 2015-10-24
          • 2021-12-05
          • 2010-10-05
          • 2014-10-23
          相关资源
          最近更新 更多