As chaves, em banco de dados, servem para relacionar tabelas e otimizar os resultados de consultas. Temos dois tipos de chaves; chave primária, chave estrangeira e além das chaves temos também os índices (também podem ser chamados de chaves secundárias) que também permitem melhorar consideravelmente a performance do banco de dados quando uma consulta é realizada.
Neste artigo sobre Chave primária, estrangeira e composta no MySQL, vamos aprender;
- Chave primária, estrangeira e composta no MySQL
- Chaves estrangeiras (FOREIGN KEY) no MySQL
- Chaves primárias compostas.
Chave primária (PRIMARY KEY) no MySQL
Para exemplificar esta aula, vamos considerar o seguinte modelo lógico de um banco de dados criado para controlar vendas de um estabelecimento qualquer;
Como criar uma tabela com chave primária?
Podemos definir a chave primária já na criação da tabela, para isso basta usar a seguinte sintaxe;
CREATE TABLE nome_tabela ( campo_1 tipo campo_2 tipo, campo_3 tipo, PRIMARY KEY (campo_1) );
Exemplo prático: Crie a seguinte tabela mostrada no modelo lógico a seguir;
O SQL para criar a tabela ficará assim;
CREATE TABLE tb01_produtos ( tb01_cod_produto INT, tb01_nome_produto VARCHAR(120), tb01_preco_produto DECIMAL(9.2), tb01_qtd_produto INT, PRIMARY KEY (tb01_cod_produto));
Como criar uma chave primária se a tabela já estiver criada?
As vezes, durante a criação da tabela esquecemos de definir qual é a chave primária dela, ou, pode ocorrer alterações no projeto de banco de dados que necessitem de alterações ou correções.
Se a tabela já estiver criada podemos alterar a sua estrutura usando o comando ALTER TABLE e você precisar acrescentar uma chave primária nela utilize a seguinte sintaxe;
ALTER TABLE nome_tabela ADD PRIMARY KEY (campo);
Exemplo prático: Crie a tabela a seguir conforme mostra o modelo lógico a seguir. Depois altere a estrutura da tabela para que o campo tb02_cod_compra seja a chave primária da tabela.
CREATE TABLE tb02_compras ( tb02_cod_compra INT , tb02_data_compra DATE, tb02_hora_compra TIME); ALTER TABLE tb02_compras ADD PRIMARY KEY(tb02_cod_compra);
Chaves estrangeiras (FOREIGN KEY) no MySQL
As chaves estrangeiras permite que uma tabela se relacione com outra, por exemplo, em uma loja existe um controle de vendas, aonde é registrada todas as vendas feita pela loja durante o dia, a loja também tem um controle de cliente contendo todos os dados pessoais de cada um deles. Note que temos duas informações totalmente diferentes, mas podemos relacionar as compras com o cliente e logo poderemos saber qual cliente fez determinada compra.
Como criar uma chave estrangeira no MySQL?
As chaves estrangeiras também podem ser criadas durante a criação da tabela ou, alterando a estrutura da tabela após criada. Para isso usamos o atributo FOREIGN KEY. Você precisa passar para este atributo qual campo da tabela será a chave estrangeira e qual a origem desta informação.
Por uma questão de performance, recomendá-se antes de criar uma FOREIGN KEY que seja criado também um INDEX no campo da chave estrangeira. O INDEX permite ordenar os dados mais rapidamente, principalmente quando a tabela possui um volume muito grande de dados.
Exemplo prático; Crie a tabela tb03_itens_compra conforme mostra o modelo lógico a seguir, sendo que o campo tb03_cod_produto é uma chave estrangeira da tabela tb02_produtos.
CREATE TABLE tb03_itens_compra ( tb03_cod_itens INT , tb03_cod_produto INT , tb03_preco_item DECIMAL(9.2) , tb03_qtd_item INT, PRIMARY KEY (tb03_cod_itens)) ; ALTER TABLE tb03_itens_compra ADD INDEX(tb03_cod_produto); ALTER TABLE tb03_itens_compra ADD FOREIGN KEY (tb03_cod_produto) REFERENCES tb01_produtos(tb01_cod_produto);
Chaves primárias compostas.
Usamos chaves primárias compostas quando precisamos de dois campos para compor uma chave primária. No exemplo a seguir criamos uma tabela cuja a chave primária é constituída de 3 de campos.
CREATE TABLE tb02_cupomfiscal (
tb02_cod_cupom INT,
tb02_cod_compra INT,
tb02_cod_operador INT,
tb02_dia_emissao DATE,
tb02_hora_emissao TIME,
PRIMARY KEY(tb02_cod_cupom, tb02_cod_compra, tb02_cod_operador));