Informix: ¿Qué sucede cuando elimina una fila con la clave primaria serial / serial8?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Tenía una pregunta rápida sobre los tipos de datos en serie utilizados en la clave primaria en los db de Informix.

Si elimino una fila, ¿la clave de serie seguirá contando o se reajustará para las filas que se eliminaron?

Entonces, si la fila actual es el número de serie 5, borro la fila de números con el número de serie 3, ¿el siguiente valor será 6 y continuaré? ¿El número de serie 3 que ahora se elimina para siempre se pierde para no volver a usarlo?

¿Fue útil?

Solución

El contador utilizado por SERIAL, SERIAL8 o BIGSERIAL aumenta de forma monotónica hasta que se envuelve. Los valores eliminados simplemente se eliminan. Si inserta un valor literal que es mayor que el contador, el contador se ajusta para que el siguiente valor insertado sea uno mayor:

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;

Esto genera los resultados:

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

Todos los tipos se comportan de manera similar. Si alcanza el máximo (2 ^ 32-1 para SERIAL, 2 ^ 63-1 para SERIAL8 y BIGSERIAL), el contador vuelve a cero, pero puede tener problemas con espacios no vacantes que se reutilizan y la clave principal rechaza el filas duplicadas En general, evite envolverlos. (Lleva bastante tiempo hacer que se ajusten, especialmente los contadores de 64 bits).

Tenga en cuenta que puede insertar manualmente un valor 'perdido', como 3 o 7. Sin embargo, IDS no lo hará por usted.

@iQ preguntó:

  

Entonces, ¿Informix reutiliza automáticamente los valores seriales no utilizados o eliminados cuando se envuelve?

No realmente. El valor vuelve a 1; si existe la fila con el valor 1, la inserción falla; si no lo hace, tiene éxito; de cualquier manera, el próximo intento intentará 2. Para ilustrar, continuando donde quedó el último ejemplo:

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;

El resultado final es:

          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   

Claramente, los siguientes tres insertos fallarían, uno tendría éxito, dos más fracasarían y luego tendrían éxito para los próximos dos mil millones de insertos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top