【问题标题】:Running out of INT datatype for PRIMARY KEY in SQLiteSQLite 中 PRIMARY KEY 的 INT 数据类型用完
【发布时间】:2019-12-16 19:15:47
【问题描述】:

所以我在 SQL 中有一个表,它有一个 INT 数据类型的 PRIMARY KEY 列。该列几乎用完了 INT 值,因为我在该列中已经有多达 20 亿加值。我尝试通过将数据类型更改为 BigInt 来解决此问题,但导航器崩溃了。请问解决这个问题的最佳方法是什么?

【问题讨论】:

  • 鉴于整数是 4 个字节并且可以将值存储到数十亿,因此 200 万行似乎并不过分。
  • 其实我的意思是20亿加起来
  • 如果需要,SQLite 的 INTEGER 数据类型最多可以占用 8 个字节,最大值为 2^63 - 1 = 9223372036854775807,所以你甚至没有接近。
  • 你真的应该在未来的PK中使用INTEGER,而不是INT:sqlite.org/lang_createtable.html#rowid

标签: sql database sqlite


【解决方案1】:

如果使用负值,行数的限制为 18,446,744,073,709,551,616,超出了大多数(任何?)设备每行可以存储 1 个字节的限制(没有行只有 1 个字节,它们将是更多字节)。

更多详情 Limits In SQLite - Maximum Number Of Rows In A Table

我尝试通过将数据类型更改为 BigInt 来解决此问题,但导航器崩溃了

至于除了检索数据时不影响事务的数据类型,这是一个微妙的问题,可以通过使用隐式或显式 CAST 来解决。数据类型除外的另一个是如果使用 INTEGER PRIMARY KEY(隐式或显式,但特别是 INTEGER 而不是 INT 或 BIGINT),这使列成为 rowid 别名并且只能存储整数值。在除 rowid 和 rowid 的别名之外的所有其他列中,可以存储任何类型的值。

更多详情Datatypes In SQLite Version 3

请问解决这个问题的最佳方法是什么? 从 SQLite 的角度来看,没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 2013-07-02
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多