【问题标题】:correct incrementing of primary key in sqlitesqlite中主键的正确递增
【发布时间】:2017-01-09 16:22:24
【问题描述】:

我使用 sqlite3 并且有一个简单的表格

CREATE TABLE `data` (
  `item_id` INTEGER,
  `item`    TEXT NOT NULL UNIQUE,
  PRIMARY KEY(item_id)
);

插入一些值:

INSERT OR IGNORE INTO `data` (`item`) VALUES ('A'), ('A'), ('B');

这将导致:

`item_id` | `item`
----------+-------
    1     |   A   
    3     |   B   

是否有可能以正确的方式获得主键的增量:

`item_id` | `item`
----------+-------
    1     |   A   
    2     |   B   

【问题讨论】:

  • 无法保证主键的连续性。这在大多数数据库中很常见,因为不仅可以删除行,而且还可以回滚事务——事务期间生成的所有主键都丢失了(并且另一个事务可能在另一个线程上并行运行,因此下一个 ID也不能只是回滚)。像往常一样,SQLite documentation on autoincrement is excellent.
  • 试图重现,但我的 SQLite (3.11.0) 版本在该插入语句上引发“唯一约束失败”错误。你是如何避免这种情况的?
  • Ups.... 使用INSERT OR IGNORE INTO ....
  • 如果您关心主键的值,而不仅仅是它具有唯一值,请不要使用自动增量主键。就这么简单。

标签: sqlite auto-increment


【解决方案1】:

尝试将 AUTOINCREMENT 关键字添加到“item_id”列,然后指定值的增量:

CREATE TABLE `data` (
  `item_id` INTEGER AUTOINCREMENT (1, 1),
  `item`    TEXT NOT NULL UNIQUE,
  PRIMARY KEY(item_id)
);

我不完全确定它是否会工作,但我目前正在使用 MS-SQL,创建表的语法似乎非常相似。

希望这会有所帮助。

【讨论】:

  • SQLite 不允许在 AUTOINCREMENT 之后传递参数,它只能是 PRIMARY KEY 子句的一部分。 (source)
  • 啊,那太糟糕了。你想做的最简单的事情总是最难的。不过感谢您的澄清。
猜你喜欢
  • 2014-10-02
  • 2015-05-11
  • 2015-06-27
  • 2011-03-18
  • 2016-04-30
  • 2013-04-06
  • 2011-10-22
  • 2014-03-05
相关资源
最近更新 更多