【问题标题】:autoincrement & decrement integer field are available in sqlite database?sqlite数据库中是否提供自动增量和减量整数字段?
【发布时间】:2011-06-15 13:53:56
【问题描述】:

我正在使用 id 获取我的数据,它是整数主键或整数。

但是在删除任何行之后...

之后,如果我们进行选择查询以显示所有内容。

但它会强制关闭,因为缺少一个 id。

我希望该 id 本身可以采用 auto incrementdecrement

当我在末尾删除一条记录(例如 id=7)之后,我添加一行,然后 id 必须是 7 而不是 8。当我在中间删除一行时(例如 id=3)然后是所有行通过加入自动指定。

你的想法可以帮到我。

【问题讨论】:

  • 您可以在 DB 中有一个自动增量字段,但是您希望在数据集末尾删除记录的行为是什么?而在中间?你想让所有的ID都改变吗????
  • 当我在末尾删除一条记录(例如 id=7)之后,我添加一行,那么 id 必须是 7 而不是 8。当我在中间删除一行时(例如 id=3 ) 然后通过加入自动指定所有行。
  • 您是否要求自动增量字段填补从序列中间删除行而留下的空白?这不是它通常的工作方式。请澄清您的问题;很难理解您要问什么。 (我知道英语不是你的母语。)
  • 在中间??????这就是我的观点,你想应用于最后一行的 id 的逻辑无法应用于其他行,这就是数据库不提供这种主键的原因。

标签: android sqlite decrement


【解决方案1】:

大多数具有自动递增列的系统会跟踪最后插入的值(或下一个要插入的值),并且永远不会重新发出数字(两次给出相同的数字),即使最后发出的数字已被删除从表中。

从你的问题来看,SQLite 是另一个这样的系统。

如果系统中有任何并发​​,那么这是有风险的,但对于单用户、一次单个应用程序的系统,您可能会侥幸:

SELECT MAX(id_column) + 1 FROM YourTable

查找下一个可用值。根据 SQLite 的行为方式,您可以将其嵌入到 INSERT 语句的 VALUES 列表中:

INSERT INTO YourTable(id_column, ...)
    VALUES((SELECT MAX(id_column) + 1 FROM YourTable), ...);

这可能行不通;您可能必须将其作为两个操作来执行。请注意,如果有任何并发​​,则两个语句形式是一个坏主意TM。主键唯一约束通常可以防止灾难,但是两个并发语句之一失败,因为它试图插入另一个刚刚插入的值 - 所以它必须重试并希望最好。显然,手机的并发性比网络服务器少,因此问题相应地不那么严重。但要小心。

不过,总的来说,最好让间隙出现在序列中,而不用担心它。通常不必担心它们。如果您必须担心差距,请不要让人们首先制造它们。或者,当您执行删除创建行时,移动现有行以填补空白。当添加新行时,这仍然会在最后留下删除创建间隙,这就是为什么最好克服“它必须是一个连续的数字序列”的心态。自增保证唯一性;它不保证连续性。

【讨论】:

  • @Jonathan Leffler 你的想法是绝对正确的,但我的问题是删除行如何通过 id 获取数据?
  • @Sitanshu:当您知道要获取的值时,您始终可以通过id 获取,但不能保证每个id 值都会获取一行(因为该值可能有已被删除)。确保一个表只包含连续的数字真的很棘手;这就是 DBMS 不尝试这样做的原因。如果你做了足够的工作,并且 DBMS 支持触发器等,你也许可以把事情整理好,但所涉及的努力通常对收益来说太大了。那么,为什么需要对 ID 值进行完全密集(连续)打包?什么算法会在删除后重新分配数字?
  • 删除后的算法还没有编好。我认为从 id 获取数据是有风险的。所以我尝试不同的解决方案。谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 2010-10-06
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2011-03-06
相关资源
最近更新 更多