none
como criar um index para não duplicar

    Question

  • tenho uma tabela onde cadastro o certificados, esse campo aceita valor NULL...
    mais não quero que ele duplique os certificados...
    o problema é que tenho + de 10000 registros e quando vou criar o index o sql acusa que tem valores duplicados que são os NULL e com isso não deixa eu continuar salvar meu index...
    alguem tem alguma solução para criar index para não duplicar o certificado ou terei de fazer na unha(código vb.net) ???
    Saturday, August 29, 2009 1:23 PM

Answers

All replies

  • Vitor,

          a Constraint de Unique é um conceito onde cada valor contido nos registros tem que ser único. Quando você tem valores nulos e cria um índice com a opção Is Unique = Yes, o SQL considera o NULL também como um valor (nulo, claro) mas não pode haver repetição do valor nulo, somente um registro contendo o NULL.

          Vou considerar para este exemplo que você está criando o índice pelo SSMS, Ferramenta gráfica.

          Este problema está acontecendo por dois motivos:
          - Você está criando o índice Primary Key (onde o Is Unique é ativado por default) - Solução: Nao crie um o índice do tipo Primary Key
          - Você está criando um outro índice e está escolhendo a opção Is Unique = Yes. Solução: Escolha a opção Is Unique = No

    MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008
    Saturday, August 29, 2009 1:43 PM
  • Vitor,

    Além das considerações do Roberto, recomendo a você verificar a possibilidade de eliminar estes registros duplicados, pois caso você deseja realmente utilizar este conceito de índices é melhor trablahar com um ambiente mais organizado.

    Claro que você possui um volume considerável de informações, mas talvez poderiamos utilizar ferramentas como SQL Server Integration Services para executar este operação, ou então através de alguns scripts Transact-SQL poderiamos realizar este tipo de procedimento.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    Saturday, August 29, 2009 9:48 PM
  • Vitor

    Não sei se entendi bem o seu problema. Mas o comentário do Galvão faz todo sentido, não seria interessante repensar parte da modelagem, em função que os registros não se dupliquem mesmo os nulos?  A questão da constraint unique como comentada antes é um problema no seu caso, pq apesar de permitr valor nulo, permite um nulo, um segundo nulo é entendido como uma duplicação.

    Uma estratégia que vc poderia adotar seria criar um trigger para fazer esse tipo de validação, verificar se o valor do campo chave nesse caso da tabela inserted (tabela interna ao código do trigger contendo a linha/linhas que foram inseridas não existe entre os registros ou é nulo), em ultimo caso. Mas eu recomendaria em primeiro lugar checar a modelagem.

    Grande abraço espero que ajude.

    Wandenkolk T. Neto -- Please Vote & "Mark As Answer" if this post is helpful to you. Clique em "Votar como resposta" se o post foi útil.
    Monday, August 31, 2009 2:49 PM
  • Já pensou em criar uma trigger? Algo como:

    create

     

    TRIGGER ValidaPK ON Tabela AFTER INSERT, UPDATE

    AS

    DECLARE

     

    @campo1 int, @campo2 int;

    select

     

    @campo1 = campo1, @campo2 = campo2 from inserted;

    IF

     

    exists

    (

     

    select campo1

     

    from dbo.Tabela with(nolock)

     

    where campo1 = @campo1 AND campo2 = @campo2

    )

     

    BEGIN

     

    RAISERROR('Ja existe uma linha com os mesmos identificadores', 16, 1);

     

    ROLLBACK TRANSACTION;

     

    END;

    GO


    mglauco
    Tuesday, September 01, 2009 7:18 PM
  • Bom Dia,

    Eu acho que a necessidade de negócio existe e é importante garantir que o certificado não se repita, mas sem impedir que registros nulos sejam vetados já que o certificado parece ter a característica de ser opcional. Acredito que o uso da trigger ou da modelagem sejam um caminho, mas ao meu ver existem soluções muito mais interessantes para essa situação já que a trigger e a modelagem podem incorrer em perda de desempenho.

    Caso alguém se interesse em alternativas mais efetivas, sugiro dar uma olhada no link abaixo.

    Unique Constraints – Aplicações, Alternativas e um lapso "justificável" do SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!710.entry

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Unique Constraints – Aplicações, Alternativas e um lapso "justificável" do SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!710.entry
    Classifique as respostas. O seu feedback é imprescindível
    Saturday, September 05, 2009 1:04 PM