Informix:serial / serial8主キーを持つ行を削除するとどうなりますか?
質問
informix dbの主キーで使用されるシリアルデータ型について簡単な質問がありました。
行を削除した場合、シリアルキーはカウントを続行しますか、または削除された行に対して再調整しますか?
現在の行がシリアル番号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ビットカウンターをラップするには、かなり時間がかかります。)
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つは失敗し、次の20億の挿入で成功します。