【问题标题】:SQLite - How to access the AUTOINCREMENT value on INSERT?SQLite - 如何访问 INSERT 上的 AUTOINCREMENT 值?
【发布时间】:2014-02-17 21:40:21
【问题描述】:

我有一个表,其中 ID 字段是自动递增的 INTEGER PRIMARY KEY。如果ID 将在下一个INSERT 上自动递增到某个整数值n,我如何在INSERT 语句中访问值n

特别是,我有时希望用 否定 ID 来初始化一行,即ID = -n (原因是除了主键之外,我还使用ID 作为布尔标志,因此我不必仅为标志创建单独的字段。

【问题讨论】:

  • “除了主键之外,我还将 ID 用作布尔标志,这样我就不必为标志创建单独的字段” –这简直太愚蠢了。不要这样做。期间。
  • 您甚至不应该尝试写入生成的键值。无论如何,大多数数据库都会忽略它。

标签: sqlite auto-increment


【解决方案1】:

你不能。行 ID 生成仅在稍后启动,而不是在评估 SQL 中的表达式时启动。有last_insert_rowid(),但没有current_insert_rowid()

此外,重载 rowid 以包含标识符之外的其他信息似乎不是一个好主意。只需使用其他列获取更多信息。

【讨论】:

    【解决方案2】:

    正如 laalto 所说,您无法访问 AUTOINCREMENT 的下一个值,但如果您真的需要,有一个解决方法。请注意,这不是做事的最佳方式,而且它不是线程安全的,所以除非你真的需要它,否则不要使用它。

    鉴于 SQLite 中“INTEGER PRIMARY KEY”的特殊处理,我们可以使用:

    SELECT max(the_column) + 1 FROM table;
    

    然后在对PK列执行INSERT时使用返回的值并显式放置。

    请注意,这与使用 AUTOINCREMENT 机制本身不同。 AUTOINCREMENT 将始终递增 id,而我们的“解决方法”将始终使用目前的最大值,如果您删除所有行,它将从 0 开始,而 AUTOINCREMENT 将继续使用它离开的数字。

    Reasuming - 这是一种解决方法,除非您真的知道自己在做什么并且仍然需要它,否则不要使用它。

    【讨论】:

      猜你喜欢
      • 2020-03-13
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      相关资源
      最近更新 更多