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).