SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Criar uma coluna de incremento automático no SQLite


O SQLite tem uma maneira interessante de lidar com colunas de incremento automático. Por colunas de incremento automático, quero dizer colunas que são incrementadas automaticamente sempre que novos dados são inseridos.

Isso é semelhante a uma IDENTITY coluna no SQL Server ou um AUTO_INCREMENT coluna em MySQL .

Este artigo explica como criar AUTOINCREMENT colunas no SQLite.

Criar automaticamente uma coluna de incremento automático


Por padrão, quando você define uma coluna como INTEGER PRIMARY KEY , ele será incrementado automaticamente sempre que você inserir NULL nessa coluna.

Exemplo:
CREATE TABLE Cats( 
    CatId INTEGER PRIMARY KEY, 
    CatName
);

Nesta tabela, o CatId coluna é uma coluna de incremento automático. Isso ocorre porque foi definido usando INTEGER PRIMARY KEY .

Agora, quando insiro NULL nessa coluna, o CatId incrementos automáticos de coluna:
INSERT INTO Cats VALUES 
    ( NULL, 'Brush' ),
    ( NULL, 'Scarcat' ),
    ( NULL, 'Flutter' );

SELECT * FROM Cats;

Resultado:
CatId       CatName   
----------  ----------
1           Brush     
2           Scarcat   
3           Flutter   

É importante observar que você pode substituir o AUTOINCREMENT valor inserindo seu próprio valor. Em outras palavras, AUTOINCREMENT só insere um valor se você não o fizer.

A maneira como funciona é, o NULL é automaticamente convertido em um número inteiro maior que o maior valor dessa coluna sobre todas as outras linhas da tabela. Se a tabela estiver vazia, o valor será 1 .

Se o maior valor da coluna for o maior inteiro possível (9223372036854775807), o SQLite escolherá uma chave não utilizada aleatoriamente. Isso normalmente significa que ele reutilizará chaves antigas que foram excluídas anteriormente. Se uma chave não utilizada não puder ser encontrada, o INSERT a operação falha com um SQLITE_FULL erro.

Basicamente, isso significa que, se você permitir DELETE operações na tabela, não há garantia de que todas as linhas estarão em ordem. Existe a possibilidade de que algumas linhas tenham um valor mais alto do que as linhas inseridas posteriormente.

Portanto, nesses casos, você não pode contar com esta coluna se precisar ordenar a tabela em ordem crescente ou decrescente, com base na ordem em que as linhas foram inseridas.

Felizmente, se isso for um problema para você, existe uma solução:O AUTOINCREMENT palavra-chave.

Use a palavra-chave AUTOINCREMENT


Como alternativa, você pode optar por definir explicitamente a coluna para incrementar automaticamente usando o AUTOINCREMENT palavra-chave.

Um benefício de usar esse método é que ele garante que todas as linhas estarão em ordem crescente. Isso ocorre porque ele não reutiliza chaves excluídas anteriormente. Cada chave será sempre uma a mais do que a maior chave que já existiu naquela tabela. Se a maior chave possível já existia nessa tabela, ela não tente usar chaves excluídas anteriormente. O INSERT falhará com um SQLITE_FULL Erro de código.

A desvantagem de usar o AUTOINCREMENT palavra-chave é que ela usa CPU extra, memória, espaço em disco e sobrecarga de E/S de disco.

Aqui está um exemplo de criação de uma coluna de incremento automático com o AUTOINCREMENT palavra-chave:
CREATE TABLE Dogs( 
    DogId INTEGER PRIMARY KEY AUTOINCREMENT, 
    DogName
);

Agora insira os dados e selecione-os:
INSERT INTO Dogs VALUES 
    ( NULL, 'Yelp' ),
    ( NULL, 'Woofer' ),
    ( NULL, 'Fluff' );

SELECT * FROM Dogs;

Resultado:
DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    
3           Fluff     

Se eu excluir Fluff desta tabela, insira uma nova linha (usando NULL como o DogId), o novo DogId seria 4. Em outras palavras, ele não reutilizaria 3.

Se a coluna foi criada sem o AUTOINCREMENT palavra-chave, a próxima linha reutilizaria o DogId de 3.

Se eu inserir um DogId de 9223372036854775807 (o maior inteiro possível), receberei o seguinte erro na próxima inserção que especifica NULL para essa coluna:
Error: database or disk is full

No entanto, eu poderia inserir explicitamente um valor menor que 9223372036854775807, desde que esse valor já não esteja sendo usado por outra linha e o INSERT operação deve ser bem-sucedida sem o erro acima.

Basicamente, quando você atingir 9223372036854775807, o incremento automático não funcionará mais.

Colunas definidas sem o AUTOINCREMENT palavra-chave não tem esse problema. Eles voltarão automaticamente e tentarão encontrar um inteiro não utilizado para usar. No entanto, se todos os números inteiros tiverem sido usados ​​(ou seja, a tabela realmente contém 9223372036854775807 linhas), mesmo essas colunas resultarão no erro acima.