Resumo : neste tutorial, você aprenderá sobre AUTOINCREMENT
o atributo de coluna SQLite e quando usá-lo em sua tabela.
ROWID
Introdução à tabela SQLite
Sempre que você cria uma tabela sem especificar a WITHOUT ROWID
opção, você obtém uma coluna implícita de incremento automático chamada rowid
. A rowid
coluna 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 people
que 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 )
Segundo, insira uma linha na people
tabela 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 )
Terceiro, consulte os dados da people
tabela usando a seguinte SELECT
instrução:
SELECT
rowid,
first_name,
last_name
FROM
people;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como você pode ver claramente na saída, o SQLite cria implicitamente uma coluna nomeada rowid
e atribui automaticamente um valor inteiro sempre que você insere uma nova linha na tabela.
Observe que você também pode fazer referência à rowid
coluna usando seus aliases: _rowid_
e oid
.
Quando você cria uma tabela que possui uma INTEGER PRIMARY KEY
coluna, essa coluna é o alias da rowid
coluna.
A instrução a seguir elimina a tabela people
e a recria. Desta vez, entretanto, adicionamos outra coluna person_id
cujo tipo de dados é INTEGER
e 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 )
Nesse caso, a person_id
coluna é na verdade a rowid
coluna.
Como o SQLite atribui um valor inteiro à rowid
coluna?
Se você não especificar o rowid
valor ou usar um NULL
valor ao inserir uma nova linha, o SQLite atribuirá automaticamente o próximo número inteiro sequencial, que é maior que o maior rowid
da tabela. O rowid
valor começa em 1.
O valor máximo da rowid
coluna é 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_FULL
erro. Além disso, se você excluir algumas linhas e inserir uma nova linha, o SQLite tentará reutilizar os rowid
valores das linhas excluídas.
Vamos fazer um teste sobre isso.
Primeiro, insira uma linha com o valor máximo na people
tabela.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira outra linha sem especificar um valor para a person_id
coluna:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
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 t1
que tenha uma coluna:
CREATE TABLE t1(c text);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira algumas linhas na t1
tabela:
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 t1
tabela:
SELECT rowid, c FROM t1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quarto, exclua todas as linhas da t1
tabela:
DELETE FROM t1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quinto, insira algumas linhas na t1
tabela:
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 t1
tabela:
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.
AUTOINCREMENT
Atributo de coluna SQLite
SQLite recomenda que você não use AUTOINCREMENT
atributos porque:
A
AUTOINCREMENT
palavra-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 AUTOINCREMENT
coluna é um pouco diferente da forma como faz para a rowid
coluna.
Considere o seguinte exemplo.
Primeiro, elimine e recrie a people
tabela. Desta vez, usamos AUTOINCREMENT
a 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 )
Segundo, insira uma linha com o rowid
valor máximo na people
tabela.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, insira outra linha na people
tabela.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Desta vez, o SQLite emitiu uma mensagem de erro porque a person_id
coluna não reutilizou o número como uma rowid
coluna.
[Err] 13 - database or disk is full
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quando você deve usar o AUTOINCREMENT
atributo 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 AUTOINCREMENT
atributo na chave primária.
Neste tutorial, você aprendeu como AUTOINCREMENT
funciona o atributo SQLite e como ele influencia a maneira como o SQLite atribui valores à coluna de chave primária.