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.