Resumo : neste tutorial, você aprenderá como usar a PRIMARY KEY
restrição SQLite para definir uma chave primária para uma tabela.
Introdução à chave primária SQLite
Uma chave primária é uma coluna ou grupo de colunas usada para identificar a exclusividade das linhas em uma tabela. Cada tabela possui uma e apenas uma chave primária.
SQLite permite definir a chave primária de duas maneiras:
Primeiro, se a chave primária tiver apenas uma coluna, use a PRIMARY KEY
restrição de coluna para definir a chave primária da seguinte maneira:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Linguagem de código: PHP ( php )
Segundo, caso a chave primária consista em duas ou mais colunas, você usa a PRIMARY KEY
restrição de tabela para definir a primária, conforme mostrado na instrução a seguir.
CREATE TABLE table_name(
column_1 INTEGER NOT NULL,
column_2 INTEGER NOT NULL,
...
PRIMARY KEY(column_1,column_2,...)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No padrão SQL, a coluna da chave primária não deve conter NULL
valores. Isso significa que a coluna da chave primária possui uma NOT NULL
restrição implícita.
No entanto, para tornar a versão atual do SQLite compatível com a versão anterior, o SQLite permite que a coluna da chave primária contenha NULL
valores.
Chave primária SQLite e tabela rowid
Quando você cria uma tabela sem especificar a WITHOUT ROWID
opção, o SQLite adiciona uma coluna implícita chamada rowid
que armazena um número inteiro assinado de 64 bits. A rowid
coluna é uma chave que identifica exclusivamente as linhas da tabela. As tabelas que possuem rowid
colunas são chamadas rowid
de tabelas.
Se uma tabela tiver a chave primária que consiste em uma coluna, e essa coluna for definida como, INTEGER
essa coluna de chave primária se tornará um alias para a rowid
coluna.
Observe que se você atribuir outro tipo inteiro, como BIGINT
e, UNSIGNED INT
à coluna de chave primária, esta coluna não será um alias para a rowid
coluna.
Como a rowid
tabela organiza seus dados como uma árvore B, a consulta e a classificação dos dados de uma rowid
tabela são muito rápidas. É mais rápido do que usar uma chave primária que não seja um alias do arquivo rowid
.
Outra observação importante é que se você declarar uma coluna com o INTEGER
tipo e PRIMARY KEY DESC
a cláusula, esta coluna não se tornará um alias para a rowid
coluna:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Criando exemplos de chave primária SQLite
A instrução a seguir cria uma tabela chamada countries
que possui country_id
coluna como chave primária.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como a chave primária da countries
tabela possui apenas uma coluna, definimos a chave primária usando PRIMARY KEY
restrição de coluna.
É possível usar a PRIMARY KEY
restrição de tabela para definir a chave primária que consiste em uma coluna, conforme mostrado na seguinte instrução:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No entanto, para tabelas cujas chaves primárias consistem em mais de uma coluna, você deve usar PRIMARY KEY
a restrição de tabela para definir as chaves primárias.
A instrução a seguir cria a country_languages
tabela cuja chave primária consiste em duas colunas.
CREATE TABLE country_languages (
country_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
PRIMARY KEY (country_id, language_id),
FOREIGN KEY (country_id) REFERENCES countries (country_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (language_id) REFERENCES languages (language_id)
ON DELETE CASCADE ON UPDATE NO ACTION
);
Linguagem de código: PHP ( php )
Exemplo de adição de chave primária SQLite
Ao contrário de outros sistemas de banco de dados, por exemplo, MySQL e PostgreSQL, você não pode usar a ALTER TABLE
instrução para adicionar uma chave primária a uma tabela existente.
Você precisa seguir estas etapas para contornar a limitação:
- Primeiro, desative a verificação constante da chave estrangeira .
- Em seguida, renomeie a tabela para outro nome de tabela (old_table)
- Em seguida, crie uma nova tabela (tabela) com estrutura exata da tabela que você renomeou.
- Depois disso, copie os dados de old_table para a tabela.
- Finalmente, ative a verificação de restrição de chave estrangeira em
Veja as seguintes afirmações:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table RENAME TO old_table;
-- define the primary key constraint here
CREATE TABLE table ( ... );
INSERT INTO table SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O BEGIN TRANSACTION
inicia uma nova transação. Ele garante que todas as instruções subsequentes sejam executadas com êxito ou que nada seja executado.
A COMMIT
declaração confirma todas as declarações.
Vamos criar um nome de tabela cities
sem chave primária.
CREATE TABLE cities (
id INTEGER NOT NULL,
name text NOT NULL
);
INSERT INTO cities (id, name)
VALUES(1, 'San Jose');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Para adicionar a chave primária à cities
tabela, execute as seguintes etapas:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE cities RENAME TO old_cities;
CREATE TABLE cities (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO cities
SELECT * FROM old_cities;
DROP TABLE old_cities;
COMMIT;
PRAGMA foreign_keys=on;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Se você usar a ferramenta SQLite GUI, poderá usar a seguinte instrução para mostrar as informações da tabela.
PRAGMA table_info([cities]);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Neste tutorial, você aprendeu a usar a PRIMARY KEY
restrição SQLite para definir a chave primária de uma tabela.