AUTOINCREMENTO SQLite

Resumo : neste tutorial, você aprenderá sobre AUTOINCREMENTo atributo de coluna SQLite e quando usá-lo em sua tabela.

ROWIDIntrodução à tabela SQLite

Sempre que você cria uma tabela sem especificar a WITHOUT ROWIDopção, você obtém uma coluna implícita de incremento automático chamada rowid. A rowidcoluna armazena um número inteiro assinado de 64 bits que identifica exclusivamente uma linha na tabela.

Vejamos o exemplo a seguir.

Primeiro, crie uma nova tabela chamada peopleque tenha duas colunas:  e :first_name, last_name

CREATE TABLE people (
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Segundo, insira uma linha na peopletabela usando a seguinte INSERT instrução:

INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Terceiro, consulte os dados da peopletabela usando a seguinte SELECTinstrução:

SELECT
   rowid,
   first_name,
   last_name
FROM
   people;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

AUTOINCREMENTO SQLite

Como você pode ver claramente na saída, o SQLite cria implicitamente uma coluna nomeada rowide atribui automaticamente um valor inteiro sempre que você insere uma nova linha na tabela.

Observe que você também pode fazer referência à rowidcoluna usando seus aliases: _rowid_e oid.

Quando você cria uma tabela que possui uma INTEGER PRIMARY KEYcoluna, essa coluna é o alias da rowidcoluna.

A instrução a seguir elimina a tabela people e a recria. Desta vez, entretanto, adicionamos outra coluna person_idcujo tipo de dados é INTEGERe a restrição de coluna é PRIMARY KEY:

DROP TABLE people;

CREATE TABLE people (
   person_id INTEGER PRIMARY KEY,
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Nesse caso, a person_idcoluna é na verdade a rowidcoluna.

Como o SQLite atribui um valor inteiro à rowidcoluna?

Se você não especificar o rowidvalor ou usar um NULLvalor ao inserir uma nova linha, o SQLite atribuirá automaticamente o próximo número inteiro sequencial, que é maior que o maior rowidda tabela. O rowidvalor começa em 1.

O valor máximo da rowidcoluna é 9,223,372,036,854,775,807, que é muito grande. Se seus dados atingirem esse valor máximo e você tentar inserir uma nova linha, o SQLite encontrará um número inteiro não utilizado e o utilizará. Se o SQLite não conseguir encontrar nenhum número inteiro não utilizado, irá gerar um SQLITE_FULLerro. Além disso, se você excluir algumas linhas e inserir uma nova linha, o SQLite tentará reutilizar os rowidvalores das linhas excluídas.

Vamos fazer um teste sobre isso.

Primeiro, insira uma linha com o valor máximo na peopletabela.

INSERT INTO people (person_id,first_name,last_name)
VALUES(	9223372036854775807,'Johnathan','Smith');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Valor máximo de rowid do SQLite

Segundo, insira outra linha sem especificar um valor para a person_idcoluna:

INSERT INTO people (first_name,last_name)
VALUES('William','Gate');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Linha SQLite INSERT sem rowid

Conforme mostrado claramente na saída, a nova linha recebeu um número inteiro não utilizado.

Considere outro exemplo.

Primeiro, crie uma nova tabela chamada t1que tenha uma coluna:

CREATE TABLE t1(c text);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, insira algumas linhas na t1tabela:

INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, consulte os dados da t1tabela:

SELECT rowid, c FROM t1;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quarto, exclua todas as linhas da t1tabela:

DELETE FROM t1;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quinto, insira algumas linhas na t1tabela:

INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por fim, consulte os dados da t1tabela:

SELECT rowid, c FROM t1;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Como você pode ver, os rowid 1, 2 e 3 foram reutilizados para as novas linhas.

AUTOINCREMENTAtributo de coluna SQLite

SQLite recomenda que você não use AUTOINCREMENTatributos porque:

A AUTOINCREMENTpalavra-chave impõe sobrecarga extra de CPU, memória, espaço em disco e E/S de disco e deve ser evitada se não for estritamente necessária. Geralmente não é necessário.

Além disso, a forma como o SQLite atribui um valor para a AUTOINCREMENTcoluna é um pouco diferente da forma como faz para a rowidcoluna.

Considere o seguinte exemplo.

Primeiro, elimine e recrie a peopletabela. Desta vez, usamos AUTOINCREMENTa coluna de atributos:

DROP TABLE people;

CREATE TABLE people (
   person_id INTEGER PRIMARY KEY AUTOINCREMENT,
   first_name text NOT NULL,
   last_name text NOT NULL
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Segundo, insira uma linha com o rowidvalor máximo na peopletabela.

INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Terceiro, insira outra linha na peopletabela.

INSERT INTO people (first_name,last_name)
VALUES('John','Smith');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Tente

Desta vez, o SQLite emitiu uma mensagem de erro porque a person_idcoluna não reutilizou o número como uma rowidcoluna.

[Err] 13 - database or disk is fullLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quando você deve usar o AUTOINCREMENTatributo de coluna?

O principal objetivo do uso do atributo AUTOINCREMENTé evitar que o SQLite reutilize um valor que não foi usado ou um valor da linha excluída anteriormente.

Se você não possui nenhum requisito como esse, não deve usar o AUTOINCREMENTatributo na chave primária.

Neste tutorial, você aprendeu como AUTOINCREMENTfunciona o atributo SQLite e como ele influencia a maneira como o SQLite atribui valores à coluna de chave primária.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *