私は、informixデータベースの主キーで使用されるシリアルデータ型について簡単な質問をしました。
行を削除した場合、シリアルキーはカウントを続行しますか、それとも削除された行を再調整しますか?
したがって、現在の行がシリアル番号5の場合、シリアル番号3の番号行を削除し、次の値は6になり、続行しますか?現在削除されているシリアル番号3は、二度と使用されないように失われますか?
SERIAL、SERIAL8、またはBIGSERIALで使用されるカウンターは、ラップアラウンドするまで単調に増加します。削除された値は単に削除されます。カウンターよりも大きいリテラル値を挿入すると、次に挿入される値が1つ大きくなるようにカウンターが調整されます。
CREATE TABLE s (s SERIAL(2) NOT NULL PRIMARY KEY, v VARCHAR(20) NOT NULL);
INSERT INTO s(s,v) VALUES(0, "Row 2");
INSERT INTO s(s,v) VALUES(0, "Row 3");
INSERT INTO s(s,v) VALUES(0, "Row 4");
INSERT INTO s(s,v) VALUES(0, "Row 5");
DELETE FROM s WHERE s = 3;
INSERT INTO s(s,v) VALUES(0, "Row 6");
INSERT INTO s(s,v) VALUES(8, "Row 8"); -- Skip 7
INSERT INTO s(s,v) VALUES(0, "Row 9");
SELECT * FROM s ORDER BY s;
これにより、次の結果が生成されます。
2 Row 2
4 Row 4
5 Row 5
6 Row 6
8 Row 8
9 Row 9
すべてのタイプは同じように動作します。最大値(SERIALの場合は2 ^ 32-1、SERIAL8およびBIGSERIALの場合は2 ^ 63-1)に達すると、カウンターはゼロに戻りますが、空いていないスペースが再利用され、主キーが拒否されるという問題が発生する可能性があります。行が重複しています。通常、それらをラップすることは避けてください。(特に64ビットカウンターをラップするのにはかなり時間がかかります。)
「missing」値(3や7など)を手動で挿入できることに注意してください。ただし、IDSはそれを行いません。
@iQは尋ねました:
では、Informixは、ラップアラウンド時に未使用または削除されたシリアル値を自動的に再利用しますか?
あまり。値は1に戻ります。値1の行が存在する場合、挿入は失敗します。そうでない場合は成功します。いずれにせよ、次の試みは2を試みます。説明のために、最後の例が中断したところから続けます。
INSERT INTO s(s,v) VALUES(2147483647, "Row 2,147,483,647");
INSERT INTO s(s,v) VALUES(0, "Row next") { 1 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 1") { 2 - Fail };
INSERT INTO s(s,v) VALUES(0, "Row next + 2") { 3 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 3") { 4 - Fail };
SELECT * FROM s ORDER BY s;
最終結果は次のとおりです。
1 Row next
2 Row 2
3 Row next + 2
4 Row 4
5 Row 5
6 Row 6
8 Row 8
9 Row 9
2147483647 Row 2,147,483,647
明らかに、次の3つの挿入は失敗し、1つは成功し、さらに2つは失敗し、次の数十億の挿入で成功します。