Informix: O que acontece quando você excluir uma linha com chave primária de série / serial8?

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu tinha uma pergunta rápida sobre tipos de dados de série utilizados na chave primária em informix db do.

Se eu excluir uma linha, vai o carry chave de série na contagem ou será re-ajustar para quaisquer linhas que foram excluídos?

Então, se linha atual é de série no 5, I fileira número de exclusão withs de série no 3, será o próximo valor será 6 e manter continuando? É de série no 3 que está agora apagado para sempre perdido não para ser usado novamente?

Foi útil?

Solução

O contador utilizado por SERIAL, SERIAL8 ou BIGSERIAL é monótona crescente até que se envolve. valores excluídos são simplesmente excluídos. Se você inserir um valor literal que é maior do que o contador, o contador é ajustado para que o valor junto inserido é um maior:

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;

Isso gera os resultados:

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

Todos os tipos se comportam de forma semelhante. Se você atingir o máximo (2 ^ 32-1 para SERIAL, 2 ^ 63-1 para SERIAL8 e BIGSERIAL), então o contador envolve a zero, mas você pode ter problemas com espaços unvacated sendo reutilizado e a chave primária rejeitou a linhas duplicadas. Geralmente, evitar envolvendo-os. (É preciso muito tempo para fazê-los quebrar, especialmente os contadores de 64 bits.)

Note que você pode manualmente inserir um valor 'desaparecidos' -. Tais como 3 ou 7. No entanto, IDS não vai fazer isso por você

@iQ perguntou:

O mesmo acontece com Informix automaticamente re-utilizar a não utilizados ou eliminados valores de série quando se envolve em torno de?

Não é verdade. Os envoltórios valor de volta para um; se a linha com um valor existe, a inserção falha; se isso não acontecer, ele consegue; de qualquer forma, a próxima tentativa vai tentar 2. Para ilustrar, continuando onde o último exemplo parou:

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;

O resultado final é:

          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, os próximos três inserções seria um fracasso, um teria sucesso, dois a mais seria um fracasso, e então eles teriam sucesso para o próximo par de bilhão de inserções.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top