0

在提交具有 SERIAL(自动编号)列的行后,该行将被删除,但当添加另一行时,已删除行的序列 ID 不会被重用。

我发现重用已删除行的序列 ID 的唯一方法是将 SERIAL 列更改为 INTEGER,然后将其更改回 SERIAL。

是否有更简单快捷的方法来完成下一个序列 ID 的重置,以使序列中没有间隙?

注意:这是一个单用户应用程序,所以不用担心多个用户同时插入行。

4

1 回答 1

1

没有特别简单的方法可以做到这一点。您可以通过插入来重置数字……嗯,很久以前,这里有错误,并且您使用的是足够古老的软件版本,尽管所有当前版本的 Informix 有时该错误可能仍然相关产品没有这个bug。

安全的技术是插入:2 31 -2(注意负 2;即 +2,147,483,646),然后插入一行 0(生成 +2,147,483,647),然后插入另一行 0 以将下一个序列号跳回 1 . 如果系统中已经有一行为 1 并且您对 SERIAL 列有唯一约束,则该插入操作将失败。然后,您需要插入最大值,或要填充的第一个间隙之前的值(另一个失败的插入)。但是,请注意,在填充间隙后,插入的值将增加 1,撞到任何仍然存在的行并导致插入失败(因为您在每个 SERIAL 列上确实有一个唯一的约束/索引,不要你 - 并且不要'如果您没有这样的索引,请坦白;去添加它们吧!)。

如果您有更新版本的 Informix,您可以插入 +2,147,483,647,然后插入一行来包装该值而不会遇到麻烦。如果你的旧版本的 Informix 有这个 bug,那么直接插入 +2,147,482,647 会导致问题。IIRC,问题在于您最终生成了 NULL,但是现在(又一个千年)已经足够久了,我不再完全确定这一点。

如果您没有注意到,这一切都不是一件容易的事。

一般来说,填补空白是不明智的;你最好离开它们而不用担心它们,或者插入某种虚拟记录,上面写着“这不是一个真正的记录——但是序列值否则会丢失,所以我在这里表明我们知道它它没有丢失,但也没有真正使用”。

于 2015-03-29T07:15:45.923 回答