0

SERIAL (autonumber) 列を含む行をコミットした後、その行は削除されますが、別の行が追加されると、削除された行のシーケンス ID は再利用されません。

削除された行のシーケンス ID を再利用するために私が見つけた唯一の方法は、SERIAL 列を INTEGER に変更してから、SERIAL に戻すことです。

シーケンスにギャップがないように、次のシーケンス ID をリセットするためのより簡単で迅速な方法はありますか?

注: これはシングル ユーザー アプリケーションであるため、複数のユーザーが同時に行を挿入する心配はありません。

4

1 に答える 1

1

それを行うための特に簡単な方法はありません。挿入することで番号をリセットできます...うーん、むかしむかし、これにはバグがあり、ソフトウェアの古いバージョンを使用しているため、バグがまだ関連している場合がありますが、Informixの現在のバージョンはすべて.製品にバグはありません。

安全な方法は、2 31 -2 (マイナス 2 に注意してください。+2,147,483,646 です) を挿入し、次に 0 を含む行を挿入し (+2,147,483,647 を生成します)、次に 0 を含む別の行を挿入して、次のシーケンス番号を 1 に戻します。システムに 1 の行が既に存在し、SERIAL 列に一意の制約がある場合、その挿入操作は失敗します。次に、最大値、または埋めたい最初のギャップの前に値を挿入する必要があります (別の失敗した挿入)。ただし、ギャップを埋めた後、挿入された値が 1 ずつ増加し、まだ存在する行にぶつかり、挿入の失敗を引き起こすことに注意してください (各 SERIAL 列に一意の制約/インデックスがあるためです。そのようなインデックスがない場合は大騒ぎします; 行って追加してください!)。

Informix のより新しいバージョンを使用している場合は、+2,147,483,647 を挿入してから 1 つの行を挿入して、問題が発生することなく値をラップできます。古いバージョンの Informix にバグがある場合、+2,147,482,647 を挿入すると直接問題が発生します。IIRC、問題は NULL が生成されてしまうことでしたが、それはもう十分に昔のこと (別のミレニアム) であり、もはやそれについて完全には確信が持てません。

気付いていない場合に備えて、これはどれも本当に簡単ではありません。

一般的に言えば、ギャップを埋めるのは賢明ではありません。それらを気にせずにそのままにしておくか、「これは実際にはレコードではありませんが、シリアル値が欠落しているため、それについて知っていることを示すためにここにいます」というようなダミーレコードを挿入する方がよいでしょう。欠けているわけではありませんが、実際には使用されていません。」

于 2015-03-29T07:15:45.923 に答える