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

Criar uma chave estrangeira no SQLite


Ao criar uma tabela no SQLite, você também pode criar uma chave estrangeira para estabelecer um relacionamento com outra tabela.

Este artigo fornece um exemplo de criação de uma chave estrangeira ao criar uma tabela no SQLite.

Ativar suporte a chave estrangeira


A primeira coisa que devemos fazer é habilitar o suporte a chave estrangeira (se ainda não tiver sido feito).

Supondo que sua biblioteca SQLite não foi compilado com SQLITE_OMIT_FOREIGN_KEY ou SQLITE_OMIT_TRIGGER definido, você ainda precisará habilitar o suporte a chave estrangeira em tempo de execução.

Para fazer isso, execute a seguinte instrução:
PRAGMA foreign_keys = ON;

Isso habilitará a imposição de chave estrangeira para sua conexão com o banco de dados.

Se você abrir outra conexão, precisará executar a mesma instrução para essa conexão.

Observe que essa configuração não é necessária para criar chaves estrangeiras, mas é necessário para aplicar chaves estrangeiras.

Agora que habilitamos o suporte a chave estrangeira, vamos em frente e criar uma chave estrangeira.

Exemplo


Imagine que queremos duas tabelas com os seguintes dados.

Tabela chamada Animais de estimação :
PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         

Tabela chamada Tipo s:
TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

E queremos o TypeId coluna dos Animais de estimação tabela para referenciar o TypeId coluna dos Tipos tabela.

Em outras palavras, queremos tornar Pets.TypeId a chave filha (com uma restrição de chave estrangeira) e Types.TypeId a chave pai (com uma restrição de chave primária).

Embora as chaves pai geralmente também sejam a chave primária da tabela, isso não é realmente um requisito. Neste exemplo, vamos torná-lo a chave primária.

Podemos usar o código a seguir para criar essas duas tabelas.
CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

A parte que cria a chave estrangeira é esta:
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

A FOREIGN KEY(TypeId) parte declara Pets.TypeId como a chave estrangeira.

Embora eu não tenha qualificado o nome da coluna com o nome da tabela, sabemos que é Pets.TypeId (e não Types.TypeId ) porque estamos executando isso no CREATE TABLE declaração para animais de estimação .

Os REFERENCES Types(TypeId) especifica a coluna à qual nossa chave estrangeira fará referência. Nesse caso, ele fará referência ao TypeId coluna dos Tipos tabela.

Agora que nossas tabelas foram criadas com a chave estrangeira apropriada, podemos adicionar dados.
INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

As tabelas agora contêm os dados mostrados acima.
sqlite> SELECT * FROM Pets;
PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         
sqlite> SELECT * FROM Types;
TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Violação de chave estrangeira


Mas agora vamos tentar inserir dados que violem a chave estrangeira.

Vamos tentar adicionar um animal de estimação que usa um TypeID inexistente (ou seja, um TypeId valor que não existe nos Tipos coluna).
INSERT INTO Pets VALUES 
    ( NULL, 'Homer', 5 );

Resultado:
Error: FOREIGN KEY constraint failed

Portanto, nossa chave estrangeira impediu com sucesso que dados ruins entrassem no banco de dados. Portanto, nos ajudou a manter a integridade dos dados.

Se você não receber esse erro e os dados foram inseridos com sucesso, você não ativou o suporte a chave estrangeira. Conforme mencionado, você precisará habilitar o suporte a chaves estrangeiras antes que suas chaves estrangeiras sejam aplicadas.

Adicionar uma chave estrangeira a uma tabela existente


A ALTER TABLE instrução em SQLite é muito limitada e não permite adicionar uma chave estrangeira a uma tabela existente.

Portanto, se você precisar adicionar uma chave estrangeira a uma tabela existente, precisará descartar a tabela e criá-la novamente com a restrição de chave estrangeira.

Se a tabela contiver dados que você deseja manter, você poderá transferir esses dados para outra tabela, antes de transferi-los de volta depois de criar a nova tabela com a restrição de chave estrangeira.