Como adicionar chave estrangeira no SQL
Chave estrangeira é um atributo ou conjunto de atributos que faz referência à chave primária da mesma tabela ou de outra tabela (relação).
- Criação de chave estrangeira junto com a criação de tabela
Uma chave estrangeira pode ser criada mesmo no momento da criação de tabelas.
Sintaxe:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Exemplo:
Primeiramente, criaremos um banco de dados com o nome “employeedb ”. Então nesse banco de dados vamos criar duas tabelas “employee” e “department”. Consideraremos essas tabelas e banco de dados para todos os exemplos subsequentes.
Criaremos uma chave primária e uma chave estrangeira enquanto criamos as tabelas “employee” e “department”, respectivamente.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.07 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.09 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.20 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec)
Criamos duas chaves primárias “Emp_ID” para uma tabela “employee”, “Dept_ID” para a tabela “department” e “Emp_ID” como uma chave estrangeira para a tabela “department” durante a criação de tabelas. Para verificar se as chaves são adicionadas às tabelas ou não, usamos o comando DESC.
- Criação de chave estrangeira com nome de restrição
Uma chave estrangeira pode ser criada mesmo no momento da criação de tabelas junto com o nome da restrição. Esse nome de restrição será útil ao descartar uma chave estrangeira de uma tabela sem descartar uma tabela inteira.
Sintaxe:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Exemplo:
Criaremos uma chave primária e uma chave estrangeira enquanto criamos as tabelas “employee” e “department”, respectivamente. A chave estrangeira será criada junto com a restrição de chave estrangeira durante a criação da própria tabela.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.11 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, CONSTRAINT emp_id_fk FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.25 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.04 sec)
Criamos duas chaves primárias “Emp_ID” para uma tabela “employee”, “Dept_ID” para a tabela “department” e “Emp_ID” como uma chave estrangeira para a tabela “department” durante a criação de tabelas. Aqui, também adicionamos uma restrição de chave estrangeira chamada “emp_id_fk”. Para verificar se as chaves são adicionadas às tabelas ou não, usamos o comando DESC.
- Criação de chave estrangeira usando o comando ALTER
É possível criar uma chave estrangeira mesmo após a criação da tabela. Ao criar uma tabela, se não adicionamos uma chave estrangeira a ela e depois precisamos adicionar a chave estrangeira a uma tabela existente, usaremos o comando ALTER nesse caso.
Sintaxe:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Exemplo:
Adicionaremos uma chave estrangeira a uma tabela existente usando o comando ALTER.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.16 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | Emp_ID | int(11) | NO | PRI | NULL | auto_increment | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL); Query OK, 0 rows affected (0.12 sec) mysql> ALTER TABLE department ADD FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID); Query OK, 0 rows affected (0.23 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC department; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | Dept_ID | int(11) | NO | PRI | NULL | auto_increment | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
Criamos duas chaves primárias “Emp_ID” para uma tabela “employee” e “Dept_ID” para a tabela “department” durante a criação de tabelas. Em seguida, usando o comando ALTER, adicionamos “Emp_ID” como chave estrangeira à tabela de departamentos. Para verificar se as chaves são adicionadas às tabelas ou não, usamos o comando DESC.