Problema:
Você deseja criar uma chave estrangeira para uma tabela em um banco de dados.
Exemplo:
Gostaríamos de criar uma tabela chamada
student
que contém uma chave estrangeira que se refere ao id
coluna na tabela city
. Solução 1 (nova tabela):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT FOREIGN KEY REFERENCES city(id) );
Discussão:
Para criar uma nova tabela contendo uma coluna de chave estrangeira que faça referência a outra tabela, use a palavra-chave
FOREIGN KEY REFERENCES
no final da definição dessa coluna. Siga isso com o nome da tabela referenciada e o nome da coluna referenciada entre parênteses. Em nosso exemplo, criamos a tabela
student
usando um CREATE TABLE
cláusula. Listamos os nomes das colunas e colocamos seus respectivos tipos de dados entre parênteses. A coluna city_id
é a chave estrangeira nesta tabela e indica o valor do ID armazenado na coluna id
na tabela city
. Escrevemos FOREIGN KEY REFERENCES
no final da definição desta coluna e siga-a com a tabela e coluna referenciadas:city(id)
. Lembre-se de que você pode criar mais de uma chave estrangeira para uma tabela.
Solução 2 (nova tabela):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, FOREIGN KEY (city_id) REFERENCES city(id) );
Discussão:
Outra maneira de definir uma chave estrangeira durante a criação da tabela é usar as
FOREIGN KEY REFERENCES
cláusula no final das definições de coluna. Neste caso, após a FOREIGN KEY
cláusula, designamos a coluna de chave estrangeira. Em seguida vem as REFERENCES
cláusula juntamente com o nome da tabela e coluna referidas. Você pode criar chaves estrangeiras em mais de uma coluna, conforme mostrado abaixo:
Solução 3 (nova tabela):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, score_id INT, subject_id INT, CONSTRAINT fk_student_score_subject_id FOREIGN KEY (subject_id, score_id) REFERENCES score_subject(subject_id, score_id) );
Neste exemplo, a restrição
fk_student_score_subject_id
é uma chave estrangeira que consiste em duas colunas:score_id
e subject_id
. Essas duas colunas de chave estrangeira referem-se a duas colunas na tabela score_subject
– score_id
e subject_id
. Aqui está outro exemplo:
Solução 4 (nova tabela):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id) );
Discussão:
Neste código, temos novamente o
CONSTRAINT
cláusula com o nome dessa restrição. Use nomes que sejam fáceis de ler e entender. Em nosso exemplo, usamos o nome fk_student_city_id
, que indica a tabela e a coluna relevantes. Em seguida, escrevemos FOREIGN KEY
e adicione (entre parênteses) o nome da coluna que se torna a chave estrangeira. Então temos as REFERENCES
cláusula seguida pelo nome da tabela e coluna referenciadas (aqui:id
). Solução 5 (tabela existente):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Discussão:
Também é possível adicionar uma nova chave estrangeira a uma tabela existente. Aqui, a tabela é alterada usando um
ALTER TABLE
cláusula. O nome da tabela (em nosso exemplo, student
) é colocado após o ALTER TABLE
palavra-chave. Em seguida, o ADD FOREIGN KEY
cláusula é seguida pelo nome da coluna que será usada como chave estrangeira. Então temos a REFERENCES clause
com o nome da tabela referenciada e o nome da coluna de chave primária entre parênteses. Observe que a tabela que você está modificando deve existir antes que este comando seja executado.
Solução 6 (tabela existente, restrição de chave estrangeira):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Discussão:
Use uma consulta como esta se quiser nomear uma coluna de chave estrangeira como uma restrição para uma tabela existente. Aqui, a restrição de chave estrangeira é denominada
fk_student_city_id
. Se você não especificar o nome da restrição, o banco de dados gerará um nome de restrição padrão (que varia de acordo com o banco de dados).