Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #90362
    Anakim
    Participante

      Tem como criar um unique index com 2 campos?
      Sendo que um campo sempre tem que ter um valor para que o banco “negue” a inserção do novo registro. Por exemplo:
      – Tenho no meu unique index o campo A e o campo B, na minha tabela eu posso ter o campo A se repetindo várias vezes se o campo B for igual a 0, mas não posso ter o campo A se repetindo se tiver B igual a 1:
      A=123 e B=0 ( posso ter na tabela )
      A=123 e B=0 ( posso ter na tabela )
      A=123 e B=1 ( só posso ter um registro deste )

      #90368
      Anakim
      Participante

        Teria como fazer isso em um check?

        #90390
        burga
        Participante

          testa isso…

          create unique index
          nome_do_indice
          on tabela (NVL2(NULLIF(B,0), A, null) + A);

          🙂
          depois da um retorno aqui no fórum avisando se funcionou!

          #90391
          Anakim
          Participante

            Funcionou!!!!
            Valeu pela ajuda.
            😛 😛 😛 😛 😛 😛 😛 😛

            #90394
            Anakim
            Participante

              burga,

              Você poderia explicar sobre este check que você fez?

              #90395
              burga
              Participante

                create unique index
                nome_do_indice
                on tabela (NVL2(NULLIF(B,0), A, null) + A);

                Opa, eu fiz meio correndo e já vi que coloquei coisas a mais,
                mas basicamente é o seguinte, não sei se você conhece as funções NLV2
                e NULLIF

                trabalhando com as duas funções juntas a gente consegue simular o
                IF THEN ELSE

                a expressão NVL2(NULLIF(B,0), A, null) pode ser entendida da seguinte maneira:

                Se B=0 então
                retorne null
                senão
                retorne A

                Como o indice UNIQUE não considera valores nulos, então se B = 0, ele vai retornar nulo o que pode possuir repetições. Caso B=1 ele retorna A
                e se o A já existir, o banco lança a exceção de restrição exclusiva violada. no caso, o (+ A) do final você pode ignorar… Nem sei o que eu pensei colocando ele…

                Fica mais fácil você entender a construção do índice conhecendo as funções NULLIF e NVL2, e sabendo que no Oracle nunca NULL = NULL.

                Espero ter ajudado…

                #90396
                Anakim
                Participante

                  Ajudou sim valeu.. Agora ficou mais claro!!!
                  😛 😛 😛 😛 😛

                  Pelo visto ainda estou bem cru no oracle.. hehehe 😳

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.