Eu tenho duas tabelas, ou seja, funcionários_ce e funcionários_sn, no banco de dados funcionários.
Ambos têm suas respectivas colunas de chave primária exclusivas.
Eu tenho outra tabela chamada deduções, cuja coluna de chave estrangeira desejo fazer referência às chaves primárias de funcionários_ce, bem como funcionários_sn. Isso é possível?
por exemplo
employees_ce
--------------
empid name
khce1 prince
employees_sn
----------------
empid name
khsn1 princess
então isso é possível?
deductions
--------------
id name
khce1 gold
khsn1 silver
fonte
Você provavelmente pode adicionar duas restrições de chave estrangeira (honestamente: nunca tentei), mas ele insistiria que a linha pai existe em ambas as tabelas.
Em vez disso, você provavelmente deseja criar um supertipo para seus dois subtipos de funcionários e, em seguida, apontar a chave estrangeira para lá. (Supondo que você tenha um bom motivo para dividir os dois tipos de funcionários, é claro).
type
na tabela de funcionários seriace
ousn
.fonte
LEFT JOIN
todos eles, se houver poucos. Quando não estiver usando a tabela base 'funcionário', a chave primária não pode ser declarada (porque está fazendo referência à tabela A ou à tabela B ou ...); agora pode ser. A sabedoria de dividiremployees_ce
eemployees_sn
foi assumida, e essa suposição é observada.Na verdade, eu mesmo faço isso. Eu tenho uma tabela chamada 'Comentários' que contém comentários para registros em 3 outras tabelas. Nenhuma das soluções realmente lida com tudo o que você provavelmente deseja. No seu caso, você faria o seguinte:
Solução 1:
Adicione um campo tinyint aos funcionários_ce e funcionários_sn que tem um valor padrão que é diferente em cada tabela (este campo representa um 'identificador de tabela', então vamos chamá-los de tid_ce & tid_sn)
Crie um índice exclusivo em cada tabela usando o PK da tabela e o campo de id da tabela.
Adicione um campo tinyint à sua tabela 'Deduções' para armazenar a segunda metade da chave estrangeira (o ID da tabela)
Crie 2 chaves estrangeiras em sua tabela de 'Deduções' (você não pode impor integridade referencial, porque uma das chaves será válida ou a outra ... mas nunca ambas:
Solução 2: Esta solução permite que a integridade referencial seja mantida: 1. Crie um segundo campo de chave estrangeira na tabela 'Deduções', permita valores nulos em ambas as chaves estrangeiras e crie chaves estrangeiras normais:
A integridade só é verificada se a coluna não for nula, para que você possa manter a integridade referencial.
fonte
Eu sei que este é um tópico estagnado há muito tempo, mas no caso de alguém pesquisar aqui, é como eu lido com chaves estrangeiras de várias tabelas. Com essa técnica, você não tem nenhuma operação em cascata imposta pelo DBA, portanto, certifique-se de lidar com
DELETE
isso em seu código.O exemplo da SO Op seria assim
fonte
Tecnicamente possível. Você provavelmente faria referência aos funcionários_ce em deduções e funcionários_sn. Mas por que você não funde funcionários_sn e funcionários_ce? Não vejo razão para você ter duas mesas. Relacionamento de ninguém para muitos. E (não neste exemplo) muitas colunas.
Se você fizer duas referências para uma coluna, um funcionário deve ter uma entrada em ambas as tabelas.
fonte
Sim, é possível. Você precisará definir 2 FKs para a 3ª mesa. Cada FK apontando para o (s) campo (s) obrigatório (s) de uma tabela (ou seja, 1 FK por tabela estrangeira).
fonte
Supondo que você deva ter duas tabelas para os dois tipos de funcionários por algum motivo, irei estender a resposta de vmarquez:
Esquema:
Dados em deduções:
Isso permitiria que as deduções apontassem para qualquer outra tabela em seu esquema. Este tipo de relação não é suportado por restrições de nível de banco de dados, IIRC, então você terá que garantir que seu aplicativo gerencie a restrição corretamente (o que torna mais complicado se você tiver vários aplicativos / serviços diferentes acessando o mesmo banco de dados).
fonte