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

SQLite - Criar um relacionamento


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.