Fazer uma PerguntaFazer uma Pergunta
 

RespondidoComo definir esta constraint ?

  • segunda-feira, 26 de outubro de 2009 18:42Mike_Kla Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Olá,

    Tenho a seguinte situação

    Em uma tabela tabela_A , tenho os campos A1 e A2.

    Os registros desta tabela tabela_A, serão sempre "filhos" de uma tabela chamada tabela_Mae1 ou de uma tabela chamada tabela_Mae2.

    Se o vínculo for com a tabela_Mae1, a chave estará no campo A1 e se o vínculo for com a tabela_Mae2 a chave estará no campo A2.

    Com definir uma constraint que obrigue a termos um vínculo pelo menos ou via campo A1 ou via campo A2 ?

    Obrigado !



Respostas

  • terça-feira, 27 de outubro de 2009 3:37Heberton Melo Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido

    Olá Mike_Kla,

    Esta meio consufo, mas segue um exemplo de acordo com o meu entendimento com a sua necessidade.


    -- ENTIDADE MAE 1

    CREATE TABLE TbMae1

          (

                IdMae1 TINYINT

                      CONSTRAINT PkIdMae1 PRIMARY KEY

          )

    GO

    -- ENTIDADE MAE 2

    CREATE TABLE TbMae2

          (

                IdMae2 TINYINT

                      CONSTRAINT PkIdMae2 PRIMARY KEY

          )

    GO

    -- INTIDADE FILHA

    CREATE TABLE TbFilha

          (

                 IdMae1 TINYINT

                      CONSTRAINT FkIdMae1 FOREIGN KEY REFERENCES TbMae1(IdMae1) NULL

                ,IdMae2 TINYINT

                      CONSTRAINT FkIdMae2 FOREIGN KEY REFERENCES TbMae2(IdMae2) NULL

                ,NoTabela VARCHAR(20)  

          )

    -- INSERINDO VALORES

    INSERT INTO TbMae1

          VALUES(1)

               ,(2)

               ,(3)

               ,(4)

    GO

    -- INSERINDO VALORES

    INSERT INTO TbMae2

          VALUES(5)

               ,(6)

               ,(7)

               ,(8)

    GO

    -- INSERINDO VALORES

    INSERT INTO TbFilha(IdMae1, IdMae2, NoTabela)

          VALUES(1,NULL,'Tabela Mae 1')

               ,(NULL,5,'Tabela Mae 2')

    GO

    -- CONSULTA

    SELECT * FROM TbFilha

    Resultado.

    IdMae1 IdMae2 NoTabela

    ------ ------ --------------------

    1      NULL   Tabela Mae 1 

    NULL   5      Tabela Mae 2

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

     

  • terça-feira, 27 de outubro de 2009 10:46Marcelo Fernandes da Silva Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido

    Mike,

    Tbm achei um pouco confuso, mas eu tbm pensei na mesma solução do Heberton, acredito que o que vc precisa é so adicionar dois campos na tabela e relacionar elas em cada tabela pai, pois um mesmo campo vc não vai poder relacionar  tabelas diferentes pois as tabelas não terao os mesmos registros.
    ou seja:
    tab1 tem registro de 1 a 5,
    tab2 tem registro de 6 a 10

    ao inserir na tab filha o reg 1 vai dar conflito na tab2 q não existe o reg 1 (por isto o Heberton criou um coluna para cada tab)

    Agora se os mesmos registros existirem nas duas Tabs este problema nao ocorrerá

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
  • quinta-feira, 5 de novembro de 2009 12:59Patricio Molina Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     RespondidoContém Código
    Olá Mike.

    Se eu entendi, você quer isso?

    ALTER TABLE Tabela WITH CHECK ADD CONSTRAINT [CK_Tabela] CHECK ((fkIdColuna1 IS NOT NULL or fkIdColuna2 IS NOT NULL))
    

    Ai você não consegue inserir nulo nas duas colunas. Pelo menos uma tem que ter valor.

    []'s
    • Sugerido como RespostaAlexandre VM quinta-feira, 5 de novembro de 2009 13:43
    • Marcado como RespostaMike_Kla segunda-feira, 23 de novembro de 2009 13:40
    •  

Todas as Respostas

  • segunda-feira, 26 de outubro de 2009 18:59Junior Galvão - MVPMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Mike,

    Peço desculpas mas não consegui entender!!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
  • segunda-feira, 26 de outubro de 2009 19:12Mike_Kla Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Olá Junior,

    Imagine a seguinte situação...

    Tenho uma tabela de notas fiscais chamada notas_fiscais_1 e outra chamada notas_fiscais_2.

    Para cada nota tenho produtos na tabela produtos_das_notas.

    Cada registro na tabela produtos_das_notas deve estar obrigatóriamente vinculado ou a tabela notas_fiscais_1 ou a notas_fiscais_2.

    Obrigado.
  • terça-feira, 27 de outubro de 2009 3:37Heberton Melo Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido

    Olá Mike_Kla,

    Esta meio consufo, mas segue um exemplo de acordo com o meu entendimento com a sua necessidade.


    -- ENTIDADE MAE 1

    CREATE TABLE TbMae1

          (

                IdMae1 TINYINT

                      CONSTRAINT PkIdMae1 PRIMARY KEY

          )

    GO

    -- ENTIDADE MAE 2

    CREATE TABLE TbMae2

          (

                IdMae2 TINYINT

                      CONSTRAINT PkIdMae2 PRIMARY KEY

          )

    GO

    -- INTIDADE FILHA

    CREATE TABLE TbFilha

          (

                 IdMae1 TINYINT

                      CONSTRAINT FkIdMae1 FOREIGN KEY REFERENCES TbMae1(IdMae1) NULL

                ,IdMae2 TINYINT

                      CONSTRAINT FkIdMae2 FOREIGN KEY REFERENCES TbMae2(IdMae2) NULL

                ,NoTabela VARCHAR(20)  

          )

    -- INSERINDO VALORES

    INSERT INTO TbMae1

          VALUES(1)

               ,(2)

               ,(3)

               ,(4)

    GO

    -- INSERINDO VALORES

    INSERT INTO TbMae2

          VALUES(5)

               ,(6)

               ,(7)

               ,(8)

    GO

    -- INSERINDO VALORES

    INSERT INTO TbFilha(IdMae1, IdMae2, NoTabela)

          VALUES(1,NULL,'Tabela Mae 1')

               ,(NULL,5,'Tabela Mae 2')

    GO

    -- CONSULTA

    SELECT * FROM TbFilha

    Resultado.

    IdMae1 IdMae2 NoTabela

    ------ ------ --------------------

    1      NULL   Tabela Mae 1 

    NULL   5      Tabela Mae 2

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

     

  • terça-feira, 27 de outubro de 2009 10:46Marcelo Fernandes da Silva Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido

    Mike,

    Tbm achei um pouco confuso, mas eu tbm pensei na mesma solução do Heberton, acredito que o que vc precisa é so adicionar dois campos na tabela e relacionar elas em cada tabela pai, pois um mesmo campo vc não vai poder relacionar  tabelas diferentes pois as tabelas não terao os mesmos registros.
    ou seja:
    tab1 tem registro de 1 a 5,
    tab2 tem registro de 6 a 10

    ao inserir na tab filha o reg 1 vai dar conflito na tab2 q não existe o reg 1 (por isto o Heberton criou um coluna para cada tab)

    Agora se os mesmos registros existirem nas duas Tabs este problema nao ocorrerá

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
  • terça-feira, 27 de outubro de 2009 14:47Heberton Melo Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Olá Marcelo,

    É isso mesmo Marcelo, sua explicação ficou clara em relação à dúvida do Mike.

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

  • quinta-feira, 29 de outubro de 2009 15:14Mike_Kla Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Olá Heberton,

    Acho que é por ai mas sua solução não cobre, segundo meu entendimento, a obrigatoriedade de termos uma FOREIGN KEY pelo menos ou seja eu poderia ter em TbFilha registros com os campos IdMae1 e IdMae2 nulos correto ?

    Obrigado.


    PS : muito obrigado a todos voces pelo tempo dispendido a esta minha questão.
  • quinta-feira, 29 de outubro de 2009 15:30Heberton Melo Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Olá Mike_Kla,

    Isso mesmo Mike nesse meu exemplo irá sim aceitar valores nulos, mas veja bem, o objetivo de uma FOREIGN KEY é manter a integridade referencial entre as entidades relacionadas, ou seja, só posso ter dados no campo ta entidade filha caso já exista o mesmo valor na entidade pai, mas isso não quer dizer que temos que ter a obrigatoriedade de colocar um valor no campo que possui a CONSTRAINT FOREIGN KEY.

    Algumas pessoas estão acostumadas sempre que criar uma CONSTRAINT FOREIGN KEY definir a mesmo como NOT NULL, não aceitar valores nulos, porem não é nenhum erro definir o mesmo como NULL, aceitar valores nulos.

    Com isso aceitamos valores nulos porem só será aceito valores que já existam na entidade pai.

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

  • quinta-feira, 29 de outubro de 2009 15:57Mike_Kla Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Olá Heberton,

    Concordo com voce com relação ao objetivo das FK e espero ter sido mais claro em minha questão. Além da integridade das chaves , eu preciso criar uma forma de obrigar a que pelo menos um das chaves exista na tabela filha.

    Valeu.
  • quinta-feira, 5 de novembro de 2009 12:59Patricio Molina Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     RespondidoContém Código
    Olá Mike.

    Se eu entendi, você quer isso?

    ALTER TABLE Tabela WITH CHECK ADD CONSTRAINT [CK_Tabela] CHECK ((fkIdColuna1 IS NOT NULL or fkIdColuna2 IS NOT NULL))
    

    Ai você não consegue inserir nulo nas duas colunas. Pelo menos uma tem que ter valor.

    []'s
    • Sugerido como RespostaAlexandre VM quinta-feira, 5 de novembro de 2009 13:43
    • Marcado como RespostaMike_Kla segunda-feira, 23 de novembro de 2009 13:40
    •  
  • segunda-feira, 23 de novembro de 2009 13:41Mike_Kla Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Obrigado a todos.

    Partricio,

    Era isto mesmo que eu procurava.

    Valeu.