提交具有SERIAL(自动编号)列的行后,该行将被删除,但当添加另一行时,被删除行的序列ID不会被重用。
我找到的重用已删除行的序列ID的唯一方法是将SERIAL列更改为INTEGER,然后将其改回SERIAL。
有没有一种更简单、更快的方法来完成下一个序列ID的重置,从而在序列中没有间隙?
注意:这是一个单用户应用程序,因此不用担心多个用户同时插入行。
没有特别简单的方法可以做到这一点。您可以通过插入…嗯,很久以前,这里面有漏洞,您使用的软件版本足够古老,有时漏洞可能仍然存在,尽管Informix产品的所有当前版本都没有漏洞。
安全的技术是插入:231-2(注意负2;即+214783646),然后插入一行0(生成+214783647),然后再插入另一行0,使下一个序列号返回1。如果系统中已经有一行为1,并且SERIAL列上有唯一约束,则插入操作将失败。然后,您需要插入最大值,或要填充的第一个间隙之前的值(另一个失败的插入)。但是,请注意,在填补空白后,插入的值将增加一,撞到任何仍然存在的行,并导致插入失败(因为您在每个SERIAL列上都有一个唯一的约束/索引,不是吗?如果没有这样的索引,也不要承认;只需添加它们!)。
如果您有一个更新版本的Informix,您可以插入+214783647,然后插入一行来包装值,而不会遇到麻烦。如果您有一个旧版本的Informix有这个错误,那么插入+214782647会直接导致问题。IIRC,问题是你最终生成了NULL,但现在(又是一个千年)已经足够长了,我不再完全确定这一点。
如果你没有注意到的话,这一切都不容易。
一般来说,填补空白是不明智的;你最好离开它们,不要担心它们,或者插入某种伪记录,上面写着"这不是一个真正的记录——但序列值在其他方面丢失了,所以我在这里表明我们知道它,它没有丢失,但也没有真正使用"。