Informix: Que se passe-t-il lorsque vous supprimez une ligne avec une clé primaire serial / serial8?

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

  •  10-07-2019
  •  | 
  •  

Question

J'avais une petite question sur les types de données série utilisés sur la clé primaire des bases de données informix.

Si je supprime une ligne, la clé de série continuera-t-elle à compter ou sera-t-elle réajustée pour toutes les lignes supprimées?

Donc, si la ligne actuelle est le numéro de série 5, je supprime la ligne de numéro avec le numéro de série 3, la valeur suivante sera-t-elle 6 et continuera-t-elle? Le numéro de série 3 qui est maintenant supprimé et définitivement perdu ne sera-t-il pas réutilisé?

Était-ce utile?

La solution

Le compteur utilisé par SERIAL, SERIAL8 ou BIGSERIAL augmente de façon monotone jusqu’à ce qu’il tourne autour. Les valeurs supprimées sont simplement supprimées. Si vous insérez une valeur littérale plus grande que le compteur, le compteur est ajusté pour que la valeur insérée suivante soit supérieure à la suivante:

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;

Ceci génère les résultats:

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

Tous les types se comportent de la même manière. Si vous atteignez le maximum (2 ^ 32-1 pour SERIAL, 2 ^ 63-1 pour SERIAL8 et BIGSERIAL), le compteur revient à zéro, mais vous pouvez rencontrer des problèmes de réutilisation des espaces non vides et le rejet de la clé primaire. doublons de lignes. En règle générale, évitez de les envelopper. (Cela prend un certain temps pour les emballer, en particulier les compteurs 64 bits.)

Notez que vous pouvez insérer manuellement une valeur "manquante", telle que 3 ou 7. Toutefois, IDS ne le fera pas pour vous.

@iQ a demandé:

  

Donc, Informix réutilise-t-il automatiquement les valeurs de série inutilisées ou supprimées lorsqu'il tourne?

Pas vraiment. La valeur revient à 1; si la ligne avec la valeur 1 existe, l'insertion échoue; sinon, ça réussit; de toute façon, la prochaine tentative tentera 2. Pour illustrer, en continuant là où le dernier exemple s'est arrêté:

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;

Le résultat final est:

          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   

Clairement, les trois prochaines insertions échoueraient, une réussirait, deux autres échoueraient, puis elles réussiraient pour les deux milliards d'inserts suivants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top