Por favor, esclareça duas coisas para mim:
- Uma chave estrangeira pode ser NULL?
- Uma chave estrangeira pode ser duplicada?
Por mais justo que eu saiba, NULL
não deve ser usado em chaves estrangeiras, mas em algumas aplicações minhas posso inserir NULL
no Oracle e no SQL Server, e não sei por que.
sql
sql-server
oracle
foreign-keys
geléias
fonte
fonte
Respostas:
Resposta curta: Sim, pode ser NULL ou duplicada.
Quero explicar por que uma chave estrangeira pode precisar ser nula ou precisa ser única ou não exclusiva. Lembre-se primeiro de que uma chave estrangeira simplesmente exige que o valor nesse campo exista primeiro em uma tabela diferente (a tabela pai). Isso é tudo que um FK é por definição. Nulo por definição não é um valor. Nulo significa que ainda não sabemos qual é o valor.
Deixe-me dar um exemplo da vida real. Suponha que você tenha um banco de dados que armazene propostas de vendas. Suponha ainda que cada proposta tenha apenas um vendedor designado e um cliente. Portanto, sua tabela de propostas teria duas chaves estrangeiras, uma com o ID do cliente e outra com o ID do representante de vendas. No entanto, no momento em que o registro é criado, um representante de vendas nem sempre é atribuído (porque ninguém está livre para trabalhar nele ainda), portanto, o ID do cliente é preenchido, mas o ID do representante de vendas pode ser nulo. Em outras palavras, geralmente você precisa da capacidade de ter um FK nulo quando talvez não saiba seu valor no momento em que os dados são inseridos, mas você conhece outros valores na tabela que precisam ser inseridos. Para permitir nulos em um FK, geralmente tudo o que você precisa fazer é permitir nulos no campo que possui o FK. O valor nulo é separado da ideia de ser um FK.
Se é exclusivo ou não, está relacionado ao fato de a tabela ter um relacionamento um-um ou um-muitos com a tabela pai. Agora, se você tiver um relacionamento individual, é possível que você possa ter todos os dados em uma tabela, mas se a tabela estiver ficando muito ampla ou se os dados estiverem em um tópico diferente (o funcionário - exemplo de seguro que @tbone deu por exemplo), então você quer tabelas separadas com um FK. Você desejaria tornar esse FK também o PK (que garante exclusividade) ou colocar uma restrição exclusiva nele.
A maioria dos FKs é para um relacionamento de um para muitos e é isso que você obtém de um FK sem adicionar mais restrições no campo. Então você tem uma tabela de pedidos e a tabela de detalhes do pedido, por exemplo. Se o cliente solicitar dez itens ao mesmo tempo, ele terá um e dez registros de detalhes do pedido que contêm o mesmo ID do pedido que o FK.
fonte
NULL
em uma tabela por váriosNULL
s em uma tabela diferente.1 - Sim, desde pelo menos o SQL Server 2000.
2 - Sim, desde que não seja uma
UNIQUE
restrição ou esteja vinculado a um índice exclusivo.fonte
Da boca do cavalo:
Veja isso:
Link do Oracle 11g
fonte
Sim, a chave estrangeira pode ser nula, conforme mencionado acima pelos programadores seniores ... Eu adicionaria outro cenário em que a chave estrangeira precisará ser nula ... suponha que tenhamos comentários em tabelas, fotos e vídeos em um aplicativo que permite comentários em fotos e vídeos. Na tabela de comentários, podemos ter duas chaves estrangeiras PicturesId e VideosId, juntamente com a principal Key CommentId. Portanto, quando você comentar apenas em um vídeo, o VideosId será necessário e o pictureId será nulo ... e se você comentar em uma imagem, o PictureId será obrigatório e o VideosId será nulo ...
fonte
isso depende do papel que isso
foreign key
desempenha na sua relação.foreign key
também é umkey attribute
na sua relação, não pode ser NULLforeign key
é um atributo normal em sua relação, ele pode ser NULL.fonte
Aqui está um exemplo usando a sintaxe Oracle:
Primeiro vamos criar uma tabela COUNTRY
Crie a tabela PROVINCE
Isso funciona perfeitamente bem no Oracle. Observe que a chave estrangeira COUNTRY_ID na segunda tabela não possui "NOT NULL".
Agora, para inserir uma linha na tabela PROVINCE, basta especificar apenas o PROVINCE_ID. No entanto, se você optar por especificar um COUNTRY_ID também, ele já deverá existir na tabela COUNTRY.
fonte
Por padrão, não há restrições na chave estrangeira, a chave estrangeira pode ser nula e duplicada.
ao criar uma tabela / alterar a tabela, se você adicionar alguma restrição de exclusividade ou não nula, somente ela não permitirá os valores nulos / duplicados.
fonte
Simplificando, os relacionamentos "Não identificados" entre Entidades fazem parte do Modelo ER e estão disponíveis no Microsoft Visio ao criar o Diagrama ER. Isso é necessário para reforçar a cardinalidade entre Entidades do tipo "zero ou mais que zero" ou "zero ou um". Observe esse "zero" na cardinalidade em vez de "um" em "um para muitos".
Agora, um exemplo de relacionamento sem identificação em que a cardinalidade pode ser "zero" (sem identificação) é quando dizemos que um registro / objeto em uma entidade - A "pode" ou "pode não" ter um valor como referência ao registro / s em outra entidade-B.
Como existe a possibilidade de um registro da entidade-A se identificar com os registros de outra Entidade-B, portanto, deve haver uma coluna na Entidade-B para ter o valor de identidade do registro da Entidade-B. Essa coluna pode ser "Nula" se nenhum registro na Entidade-A identificar o registro / s (ou objeto / s) na Entidade-B.
No Paradigma Orientado a Objetos (mundo real), há situações em que um objeto da Classe B não depende necessariamente (fortemente acoplado) do objeto da classe A para sua existência, o que significa que a Classe B é fracamente acoplada à Classe Para que a classe A possa "conter" (contenção) um objeto da classe A, em oposição ao conceito de objeto da classe B, deve ter (composição) um objeto da classe A, para seu (objeto de classe) B) criação.
Do ponto de vista da Consulta SQL, você pode consultar todos os registros na entidade-B que "não são nulos" para a chave estrangeira reservada para a Entidade-B. Isso trará todos os registros com certo valor correspondente para as linhas na Entidade-A ou, alternativamente, todos os registros com valor Nulo serão os registros que não possuem nenhum registro na Entidade-A na Entidade-B.
fonte
Eu acho que é melhor considerar a possível cardinalidade que temos nas tabelas. Podemos ter zero cardinalidade possível possível. Quando é opcional, a participação mínima de tuplas da tabela relacionada pode ser zero. Agora você enfrenta a necessidade de valores de chave estrangeira serem permitidos nulos.
Mas a resposta é que tudo depende dos negócios.
fonte
A ideia de uma chave estrangeira é baseada no conceito de referenciar um valor que já existe na tabela principal. É por isso que é chamada de chave estrangeira na outra tabela. Esse conceito é chamado de integridade referencial. Se uma chave estrangeira for declarada como um campo nulo, ela violará a própria lógica da integridade referencial. A que se refere? Só pode se referir a algo que está presente na tabela principal. Portanto, acho que seria errado declarar um campo de chave estrangeira como nulo.
fonte
NULL
, mas o que a integridade referencial diz é que, se fizer referência a "alguma coisa", deve estar lá.Eu acho que a chave estrangeira de uma tabela também é a chave primária de alguma outra tabela. Portanto, não permite nulos. Portanto, não há dúvida de ter valor nulo na chave externa.
fonte