SQLite suporta relacionamentos como qualquer outro sistema de gerenciamento de banco de dados relacional.
SQLite é um relacional sistema de gerenciamento de banco de dados (RDBMS). Ele usa o mesmo modelo relacional que outros DBMSs populares (como MySQL, Oracle, SQL Server, MS Access) usam.
O que isso significa é que você pode criar várias tabelas e vinculá-las umas às outras por meio de um relacionamento .
Um relacionamento é onde você tem várias tabelas que contêm dados relacionados e os dados são vinculados por um valor comum armazenado em ambas as tabelas.
O diagrama a seguir ilustra esse conceito:
Então, vamos adicionar outra tabela chamada Albums , vincule-o aos nossos Artistas tabela por meio de um relacionamento.
Fazer isso nos permitirá pesquisar a qual artista um determinado álbum pertence.
Criar a nova tabela
Então vamos em frente e criar os Álbuns tabela:
CREATE TABLE Albums( AlbumId INTEGER PRIMARY KEY, AlbumName TEXT NOT NULL, Year TEXT NOT NULL, ArtistId INTEGER NOT NULL, FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) );
Semelhante a quando criamos os Artistas No entanto, nesta, adicionamos
FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
até o final da declaração. Isso cria uma restrição de chave estrangeira no Albums.ArtistId coluna. O que isso significa é que qualquer dado inserido nesta coluna deve corresponder a um valor no Artists.ArtistId coluna.
Se não fizéssemos isso, seria possível ter um álbum que não pertence a um artista. Em outras palavras, poderíamos ter registros órfãos em nosso banco de dados. Não é bom se você estiver tentando manter a integridade referencial.
Agora, se executarmos um
.tables
comando, devemos ver as duas tabelas no banco de dados:sqlite> .tables Albums Artists
Teste a relação
Depois de criar a tabela com a chave estrangeira, podemos testá-la tentando inserir dados incorretos. Podemos tentar inserir um álbum com um ArtistId que não corresponde a um ArtistId na tabela referenciada (ou seja, os Artistas tabela):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
Isso deve resultar no seguinte:
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
Além disso, executando um
SELECT
instrução na tabela não retornará nenhum dado. Isso ocorre porque a restrição de chave estrangeira bloqueou a inserção do valor errado.
Não funcionou?
Se você não receber um erro ao tentar inserir dados incorretos como este, talvez seja necessário verificar suas configurações.
Execute o seguinte comando:
PRAGMA foreign_keys;
Se isso resultar em
0
significa que suas restrições de chave estrangeira estão desabilitadas. Na verdade, este é o comportamento padrão do SQLite (é para compatibilidade com versões anteriores). Para habilitar restrições de chave estrangeira, digite o seguinte
PRAGMA foreign_keys = ON;
Agora, executando
PRAGMA foreign_keys;
deve retornar 1
, e as tentativas subsequentes de inserir uma chave estrangeira inválida falharão. No entanto, se o
PRAGMA foreign_keys;
comando não retorna nenhum dado, sua implementação SQLite não suporta chaves estrangeiras (seja porque é mais antiga que a versão 3.6.19 ou porque foi compilada com SQLITE_OMIT_FOREIGN_KEY
ou SQLITE_OMIT_TRIGGER
definiram). Inserir mais dados
Agora que o relacionamento foi estabelecido, podemos adicionar quantos dados precisarmos, com a certeza de que apenas registros com chaves estrangeiras válidas serão inseridos.
INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7); INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7); INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1); INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11); INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17); INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6); INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13); INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13); INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13); INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1); INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1); INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7); INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);
Em seguida, selecionaremos dados de ambas as tabelas usando um
JOIN
demonstração.