[firebase-br] Chave Primaria e Chave Secundária Compostas

Forrest® fernando.bg em gmail.com
Qua Jan 18 13:37:05 -03 2012


Em 18/01/2012 09:34, welder escreveu:
> *alter table PEDIDOS_ITENS add constraint FK_PEDIDOS_ITENS_1 foreign key
> (PED_CODIGO, EMP_CODIGO) references PEDIDOS(CODIGO,EMP_CODIGO);*
>
> Agora vc pode tentar fazer a chave estrangeira dessa forma não sei se o FB
> vai permitir não testei.
>
> *alter table PEDIDOS_ITENS add constraint FK_PEDIDOS_ITENS_1 foreign key
> (PED_CODIGO) references PEDIDOS(CODIGO);*

> Mas não seria mas necessário isso aqui porque você já fez no script anterio

Isso mesmo no anterior eu coloquei como fazer a chave estrangeira da maneira correta utilizando os dois campos como chave.
Só demonstrei o que talvez poderia tentar fazer se não tiver o campo EMP_CODIGO na tabela de itens entendeu agora, mas o correto é ter esse campo e 
colocar a chave completa, como disse não sei se o FB iria permitir uma FK com parte da chave só.

> Mas mesmo que permita vejo um problema nisso, caso você tenha dois pedidos
> com o mesmo número ele vai trazer os itens dos dois pedidos independente da
> empresas. Ah note que incluí o código da empresa na chave primária da
> tabela de itens.

> *Mas criando a chave estrangeira incluindo o EMP_CODIGO não irá trazer
> somente os pedidos de uma empresa?*

Na verdade a chave estrangeira contendo o EMP_CODIGO vai garantir a integridade de que aquele item pertence a tal empresa e tal pedido.
Talvez você esteja fazendo confusão por pensar na consulta para trazer os resultados. Se precisar na sua consulta trazer todos os pedidos 
independentes de empresas você consegue fazer. Se não colocar o campo da empresa nos itens quando fazer uma consulta não tem como saber de que empresa 
pertence tal item vou tentar dar um exemplo.
Vamos supor que tem os seguintes pedidos.

Pedidos   empresa    itens    descrição
    1         1         1      item 1 emp 1 ped 1
    1         1         2      item 2 emp 1 ped 1
    2         1         1      item 1 emp 1 ped 2
    1         2         1      item 1 emp 2 ped 1
    1         3         1      item 1 emp 3 ped 1

Se eu faço o select

SELECT PEDIDO, EMPRESA, ITEM, DESCRIÇAO
FROM ITENS
WHERE (CODPEDIDO = 1) AND (CODEMPRESA = 1)

O resultado seria :

Pedidos   empresa    itens    descrição
    1         1         1      item 1 emp 1 ped 1
    1         1         2      item 2 emp 1 ped 1

caso não tenha a amarração da chave do campo empresa como você saberia a qual empresa pertence o item. um select ficaria assim.

SELECT PEDIDO, EMPRESA, ITEM, DESCRIÇAO
FROM ITENS
WHERE (CODPEDIDO = 1)

O resultado seria :

Pedidos   empresa    itens    descrição
    1         1         1      item 1 emp 1 ped 1
    1         1         2      item 2 emp 1 ped 1
    1         2         1      item 1 emp 2 ped 1
    1         3         1      item 1 emp 3 ped 1

Bom espero ter conseguido explicar o que pensei mais do que complicado, qualquer coisa é só chamar.

T++++++++++++++






Mais detalhes sobre a lista de discussão lista