重置SERIAL列上的下一个序列ID

时间:2015-03-29 05:09:25

标签: informix autonumber

在使用SERIAL(autonumber)列提交行之后,该行将被删除,但是当添加另一行时,不会重复使用已删除行的序列ID。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

如果你没有注意到,这一切都不容易。

一般来说,填补空白是不明智的;你最好离开他们并且不要担心他们,或者插入某种虚拟记录,说明这不是真正的记录 - 但序列值却因此而丢失,所以我'在这里表明我们知道它并且它不会丢失但是并没有真正使用过#34;。