Jump to content

Archived

This topic is now archived and is closed to further replies.

Fabio.Aguiar

Usando chaves primarias auto incrementais e chaves estrangeiras

Recommended Posts

Muitas pessoas não sabem usar chaves primarias e chaves extrangeiras para organizar e validar suas tabelas. A ideia deste artigo é demonstrar como podemos utilizar essas duas ferramentas em nosso banco de dados para que não haja duplicação de informações e ainda validar dados.

Outra vantagem nisso é a indexação, mas isso veremos num próximo artigo.

 

A chave primaria ou primary key serve para identificar uma coluna em uma tabela, desta forma podemos garantir que haverá uma forma simples de indexar a tabela.

 

Já a Chave extrangeira, ou foreign key serve para validar dados. Imagine que você tenha duas tabelas e uma interaja com a outra. Isso pode ser um problema pois você pode colocar informações inconsistentes em uma delas e a relação ficar quebrada.

 

Com a chave extrangeira, esse problema não ocorre, pois ao tentar inserir algum dado em uma tabela, ela irá pesquisar na tabela relacional se há o item que você deseja inserir e se não houver um item relacionado não deixará você inserir este dado.

 

Vamos criar duas tabelas e inserir alguns itens para verificar como isso funciona.

 

Primeiramente, vamos nos debruçar na questão da chave primaria ou primary key.

 

Criando tabelas com chave primária auto incremental

 

create table categorias(

cat_id int not null primary key identity(1,1),

/* aqui temos a chave primaria e o identificador que inicia com 1 e se auto incrementa de 1 (1,1)*/

nome nvarchar (20));

 

Aqui criamos uma tabela de categorias onde há dois campos, um de identificação da categoria e o nome que receberá essa categoria.

 

Inserindo dados

 

insert into categorias (nome) values ('Estivas');

insert into categorias (nome) values ('Cama Mesa e Banho');

insert into categorias (nome) values ('Vestuário');

insert into categorias (nome) values ('Brinquedos');

insert into categorias (nome) values ('Esportivos');

insert into categorias (nome) values ('Frios');

 

Perceba que só coloquei o campo nome no insert. Desta maneira, informo ao SQL que irei adicionar dados neste campo e deixo o campo cat_id com o próprio SQL. Se nesta tabela houvessem outros campos, deveria informar ao comando insert quais campo iria inserir dados, deixando sempre o campo cat_id (identificador) de fora pois o SQL irá adicionar automaticamente os dados necessários neste campo.

 

O campo cat_id, por ser um campo auto incremental, não pode ser explicitado no comando de inserção. Desta maneira o próprio SQL irá adicionar valores a este campo.

Criar tableas com foreign key

create table produtos(

prod_id int not null primary key identity (10,2),

cat_id int, foreign key(cat_id) references categorias(cat_id),

nome nvarchar (20),

valor decimal(4,2));

 

Neste caso decidi colocar o auto incremental iniciando com 10 e incrementando de dois em dois (10,2) só para demostrar que podemos fazer com que uma chave de identificação seja iniciada com um número diferente de 1 e incrementado com um numero também diferente de 1.

 

Perceba que tive que criar um campo com o mesmo nome da tabela categorias (cat_id) que recebe um valor inteiro e depois informei que ele é uma chave estrangeira e mostrei a qual tabela e campo ela se refere foreign key(cat_id) references categorias(cat_id). Desta maneira este campo só aceitará dados que se relacionem com o campo cat_id da tabela categorias.

 

Iserindo dados na tabela produtos

 

insert into produtos (cat_id, nome, valor) values (1, 'Arroz Tio João', 1.40);

 

Alterando tipo de dados na tabela

 

alter table produtos alter column valor decimal (9,2);

 

Nota: neste caso eu alterei a coluna valor da tabela produtos que recebia um valor decimal (4,2) por (9,2).

 

Para compreender melhor tente fazer o seguinte insert:

 

insert into produtos (cat_id, nome, valor) values (7, 'qualquer coisa', 10.00);

 

O SQL lhe retornará um erro:

Erro Principal 0x80040E2F, Erro Secundário 25026

> insert into produtos (cat_id, nome, valor) values (7, 'qualquer coisa', 10.00)

O valor de uma chave estrangeira não pode ser inserido porque não existe um valor de chave primária correspondente. [ Foreign key constraint name = FK__produtos__000000000000006F ]

 

Este erro informa que não há valor correspondente na tabela categorias e por isso não poderá inserir este dado pois ele seria inconsistente. Desta forma temso certesa que os dados inseridos são válidos e relacionados entre as tabelas categoria e produtos.

 

Mas perceba que se você fizer este insert:

insert into produtos (cat_id, nome, valor) values (6, 'Queijo prato', 15.50);

Não haverá erro pois na tabela categorias há uma chave primaria com o valor de 6, ao qual se refere ao item “frios”.

 

Fábio Aguiar

Share this post


Link to post
Share on other sites

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Que bacana e eu achava que Foreign Key era um bicho de sete cabeças.

 

Parabéns http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.