sql - Uma chave primária pode ser usada em uma chave estrangeira? - Stack Overflow em Português
Uma chave primária pode ser usada em uma chave estrangeira?
O seguinte exemplo pode ocorrer?
| Id | nome | data | qnt |
PK -> Id
FK -> (Id, qnt)
Ou há algum tipo de restrição?
sql modelagem chave-estrangeira chave-primária
editada 26/10/15 às 17:16
perguntada 16/10/14 às 0:29
Victor MarianoVictor Mariano
Pode ocorrer. Só não me parece muito correto uma FK com uma quantidade...
16/10/14 às 0:37
16/07/15 às 0:41
1) A única restrição para chaves estrangeiras é que elas devem apontar para uma chave única.
Note que toda PK, por definição, é uma chave única.
Pense o seguinte: a chave estrangeira indica quem é o registro pai, do qual o registro filho depende e sem ele ficaria órfão. Além disso o registro filho não pode ter dois pais (ponto!)
2) Uma chave é uma campo que identifica o registro, como um nome de uma pessoa. Uma chave única é um campo que identifica unicamente um registro, como um CPF.
3) Qualquer chave pode ser composta por mais de uma coluna. Ai vai depender muito do schema mas em geral uma chave é algo que identifica o registro.
4) Um campo que será usado como chave nunca deveria ser mutável. Isto é: nunca deveria ser um campo cujo valor possa ser alterado, por exemplo seu CPF, imagine que seu CPF pudesse mudar o tempo todo, como é que você poderia ser identificado por isso?
5) Um campo quantidade não é um bom candidato para ser usado como chave, ele é um campo (relativamente) mutável e não identifica o registro. Na verdade não passa de um atributo então não use-o como chave. Se você faz muitas pesquisas filtrando por este campo pode ser interessante indexá-lo para melhorar a performance mas não elevá-lo a uma chave.
@Maniero A implementação da constraint vai depender do SGBD, exemplos:
MSSQL e MySQL.
e a referência sobre o conceito de FK na Wikipédia
Porém mesmo que o SGBD permita isso é uma quebra da integridade relacional. Por que? Bem se você muda o id do registro pai, sem alterar os registros filhos eles ficarão órfãos. Se um filho pode ter "n pais" então é melhor inverter a hierarquia e fazer o registro "ex-pai" referenciar o registro "ex-filho". Se a relação for N para M então seria melhor criar uma tabela de relacionamento com FKs para "pais" e "filhos".
Pode até ser que exista alguma necessidade em algum lugar de criar uma FK para um chave not unique mas as poucas vezes em que vi tal coisa foram em erros graves de modelagem.
editada 1/11/17 às 13:33
respondida 16/10/14 às 11:42
FK não precisam ser únicas nem ser imutáveis. É altamente desejável que seja assim, raramente existe um caso onde esta regra não é aplicável mas dizer que deve ser é, no mínimo, um exagero.
16/10/14 às 11:49
@bigwon Não acredito que seja um exagero. Essas são regras de integridade relacional e embora os SGBDs permitam que você não siga as regras eu prefiro usa-las. Isso ajuda a manter meus dados íntegros =)
16/10/14 às 13:24
Mas então você está afirmando na resposta algo que é apenas sua opinião. Para quem não sabe, a resposta pode induzir ao erro e a pessoa pode achar que é obrigatório.
16/10/14 às 13:29
O Id, que é chave primária, não só pode como frequentemente é usado em FKs.
Se quer saber se a chave pode ser composta, ou seja, usar mais de uma coluna como FK? Sim, pode e também é comum acontecer.
qnt além de ser um nome ruim para indicar alguma coisa (eu vou imaginar que seja quantidade) provavelmente não é uma boa escolha para fazer parte de uma FK. Mas sei lá, pode existir um motivo. Eu não sigo regras de ouro, eu vejo a necessidade. Normalmente colunas que possuem dados não muito estáveis não são recomendados para uso em FK. É preferível usar colunas que identifique alguma coisa. Uma quantidade não identifica nada.
Veja o artigo na Wikipedia (em inglês melhor).
Sobre chave composta.
editada 31/10/17 às 12:42
respondida 16/10/14 às 0:41
vlw! foi só um exemplo, eu sou bem específico na nomeação de campos, ou, variáveis... para não me perder rsrs
– Victor Mariano
16/10/14 às 0:50
Uma palavrinha fora do assunto, mas talvez te ajude, comece a melhorar nos nomes das variáveis, você vai ver que no futuro, um nome conciso, mas completo, é o diferencial para não se perder. Só agora percebi o quão antigo é esse post. Jesus, me salva
31/10/17 às 13:24
Sim , um exemplo :
Numero (pk) Valor Data
Nota_fiscal_item
Numero (pk) (fk nota_fiscal.numero) Num_item (pk) Desc_item Valor
Entendendo claro que o modelo é uma grande simplificacão.
respondida 16/10/14 às 0:42
16/10/14 às 0:51
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag sql modelagem chave-estrangeira chave-primária ou faça sua própria pergunta.