No SQL, você cria um relacionamento criando uma restrição de chave estrangeira.
Mais especificamente, você tem uma tabela pai e uma tabela filho. O pai contém a chave primária e a tabela filho contém uma chave estrangeira que faz referência à chave primária da tabela pai.
Ao usar SQL para criar um relacionamento, você pode criar o relacionamento no momento em que cria a tabela ou pode criá-lo posteriormente (alterando a tabela). Este artigo abrange os dois cenários.
Crie um relacionamento ao criar a tabela
Aqui está um exemplo de como criar um relacionamento dentro do seu
CREATE TABLE
declaração no momento em que você cria a tabela. CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
Aqui criei duas tabelas; um chamado
Parent
e o outro chamado Child
. Eu criei o relacionamento dentro da definição da tabela para filho. O relacionamento é criado com o
CONSTRAINT
argumento. Observe que isso ainda está dentro do CREATE TABLE
demonstração. A relação precisa de um nome. Neste caso eu chamei de
FK_Child_Parent
. A FOREIGN KEY
part é seguido pelo nome da coluna (na tabela filha) que será a chave estrangeira. As
REFERENCES
parte especifica a coluna à qual a chave estrangeira fará referência. Nesse caso, ele faz referência ao ParentId
coluna do Parent
tabela. Isso é feito usando REFERENCES Parent (ParentId)
. Isso é tudo o que é necessário para criar o relacionamento.
Observe que os exemplos nesta página foram feitos usando o SQL Server. Dependendo do seu DBMS, pode ser necessário alterar alguns detalhes das definições de coluna.
Por exemplo
IDENTITY
é a versão do SQL Server do que às vezes é chamado de AUTO_INCREMENT
em outros SGBDs (como MySQL). Se você usa SQLite, veja como criar uma coluna de incremento automático no SQLite. Adicionar um relacionamento a uma tabela existente
Você também pode adicionar um relacionamento a uma tabela existente, simplesmente usando o
ALTER TABLE
demonstração. Vamos fingir que não criamos o relacionamento ao criar as duas tabelas do exemplo anterior. Então, vamos fingir que fizemos isso:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
Portanto, neste cenário, tudo o que fizemos foi criar duas tabelas. Nenhuma relação foi criada entre eles.
Agora, depois de criar as tabelas, de repente nos lembramos “oh droga, esqueci de criar um relacionamento!”.
Sem problemas, agora podemos fazer isso:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
Feito. Acabamos de adicionar o relacionamento usando os mesmos detalhes do exemplo anterior.
Observe que o SQLite não suporta a adição de chaves estrangeiras com o
ALTER TABLE
demonstração. Veja como adicionar uma chave estrangeira a uma tabela existente no SQLite para saber mais sobre isso. Na atualização/exclusão
Por padrão, os relacionamentos do SQL Server são criados usando
ON DELETE NO ACTION
e ON UPDATE NO ACTION
. Portanto, os exemplos anteriores foram criados usando essa configuração. No entanto, diferentes DBMSs podem usar outras configurações padrão.
De qualquer forma, você pode especificar isso explicitamente em seu código. Assim, podemos modificar o exemplo anterior para ficar assim:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
O que isso realmente significa é que, se alguém tentasse excluir ou atualizar um registro na chave primária, ocorreria um erro e a alteração seria revertida. Esta é a forma do SQL Server de prevenir quaisquer alterações que possam quebrar a integridade referencial do seu sistema.
Basicamente, a razão pela qual você cria um relacionamento em primeiro lugar é impor a integridade referencial.
No entanto, você tem algumas opções de como deseja que o SQL Server lide com essas situações.
Especificamente, você pode usar qualquer um dos seguintes valores:
NO ACTION
:um erro é gerado e a ação excluir/atualizar na linha na tabela pai é revertida.CASCADE
:as linhas correspondentes são excluídas/atualizadas na tabela de referência se essa linha for excluída/atualizada na tabela pai.SET NULL
:Todos os valores que compõem a chave estrangeira são definidos comoNULL
se a linha correspondente na tabela pai for excluída ou atualizada. Isso requer que as colunas de chave estrangeira sejam anuláveis.SET DEFAULT
:Todos os valores que compõem a chave estrangeira são definidos com seus valores padrão se a linha correspondente na tabela pai for excluída ou atualizada. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão. Se uma coluna for anulável e não houver um valor padrão explícito definido,NULL
torna-se o valor padrão implícito da coluna.