Informix: Was passiert, wenn Sie eine Zeile mit seriell / Serial8 Primärschlüssel löschen?

StackOverflow https://stackoverflow.com/questions/1819040

  •  10-07-2019
  •  | 
  •  

Frage

hatte ich eine kurze Frage auf seriellen Datentypen auf Primärschlüssel auf Informix-DBs verwendet.

Wenn ich eine Zeile löschen, wird die Seriennummer trägt auf dem Zählen oder wird es neu justieren für alle Zeilen, die gelöscht wurden?

Also, wenn aktuelle Zeile seriell ist kein 5, I Nummer Zeile löschen withs Seriennummer 3, wird der nächste Wert 6 und halten auf tragen? Ist die Seriennummer 3, die nun für immer gelöscht verloren nicht wieder verwendet werden?

War es hilfreich?

Lösung

Der Zähler von SERIAL verwendet, SERIAL8 oder BIGSERIAL steigt monoton, bis es um hüllt. Gelöschte Werte werden einfach gelöscht. Wenn Sie einen literalen Wert einfügen, der größer ist als der Zähler ist, wird der Zähler so eingestellt, dass der nächste eingefügte Wert ist eine größer:

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;

Dies erzeugt die Ergebnisse:

          2     Row 2
          4     Row 4
          5     Row 5
          6     Row 6
          8     Row 8
          9     Row 9

Alle verhalten sich die Typen ähnlich. Wenn Sie die maximale (2 ^ 32-1 für die serielle, 2 ^ 63-1 für SERIAL8 und BIGSERIAL) erreichen, dann wickelt der Zähler auf Null zurück, aber Sie können Probleme mit unvacated Räumen laufen wieder verwendet wird und der Primärschlüssel wies die doppelte Zeilen. Im Allgemeinen zu vermeiden, sie wickeln. (Es dauert eine ganze Weile, um sie wickeln, vor allem die 64-Bit-Zähler).

Beachten Sie, dass Sie manuell einen ‚fehlenden‘ Wert einfügen können -. Wie 3 oder 7 jedoch IDS wird das nicht für Sie tun

@iQ fragt:

  

So hat Informix automatisch wiederverwenden die ungenutzten oder serielle Werte gelöscht, wenn sie umschlingt?

Nicht wirklich. Der Wert springt zurück auf 1; wenn die Zeile mit dem Wert 1 vorhanden ist, wobei der Einsatz scheitert; wenn dies nicht der Fall, es gelingt; Zur Veranschaulichung In beiden Fällen wird der nächste Versuch 2. versuchen, deren Fortsetzung, wenn das letzte Beispiel aufhörte:

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;

Das Endergebnis ist:

          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   

Klar, die nächsten drei Einsätze scheitern würden, würde man Erfolg haben, zwei weitere scheitern würde, und dann würden sie für die nächsten paar Milliarden Einsätze erfolgreich zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top