none
Erro ao inserir dados via BD (Cannot insert duplicate key row in object 'dbo.TPRODUTO' with unique index 'TXPRDRED'. The duplicate key value is (0, <NULL>))

    Pergunta

  • Boa tarde.

    Estou tentando fazer uma inserção manual de urgência no banco de dados mas o sistema está dando erro ao inserir.

    Alguém já passou por este erro? Estava dando uma olhada aqui e a Microsoft manda atualizar o windows server

    https://support.microsoft.com/pt-br/help/2962767/fix-cannot-insert-duplicate-key-error-occurs-when-you-update-a-table-b

    Mas estou fazendo este procedimento local em minha máquina.


    CharlesTI.

    terça-feira, 15 de maio de 2018 20:43

Respostas

  • Boa tarde.

    Estou tentando fazer uma inserção manual de urgência no banco de dados mas o sistema está dando erro ao inserir.

    Alguém já passou por este erro? Estava dando uma olhada aqui e a Microsoft manda atualizar o windows server

    https://support.microsoft.com/pt-br/help/2962767/fix-cannot-insert-duplicate-key-error-occurs-when-you-update-a-table-b

    Mas estou fazendo este procedimento local em minha máquina.


    CharlesTI.

      Esse problema é muito simples  ,existe na sua tabela um UNIQUE INDEX  chamado TXPRDRED

    Comforme especificação , o UNIQUE INDEX ,só pode ter um valor NULO, e e esse o erro , a tentativa de inserir mais de um valor nulo para a coluna , 

    seque uma demostração

    DROP TABLE  IF EXISTS produtos
    
    CREATE TABLE produtos
    (
     idproduto INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
     Nome VARCHAR(100),
     Codigo VARCHAR(10) 
    )
    
    
    CREATE UNIQUE NONCLUSTERED INDEX TXPRDRED ON dbo.produtos(Codigo)
    
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 1',NULL );
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 2','P2' );
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 3','P3' );
    
    --So existe uma linha
    SELECT * FROM dbo.produtos AS P
    WHERE P.Codigo IS NULL
    
    
    --Essa linha gera o erro
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 4',NULL );
    --Cannot insert duplicate key row in object 'dbo.produtos' with unique index 'TXPRDRED'. The duplicate key value is (<NULL>).
    
    
    --Identificar a coluna indexada
    
    
    SELECT I.object_id,
           [Nome Indice] = I.name,
           I.type_desc,
           I.is_unique,
           tabela = T.name,
           [Coluna Indice] = IC.column_id,
           IC.key_ordinal,
           IC.is_included_column,
           [Nome Coluna Indexada] = C.name,
           [Coluna Tabela] = C.column_id,
           C.system_type_id
      FROM sys.indexes AS I
      JOIN sys.index_columns AS IC
        ON I.object_id  = IC.object_id
       AND I.index_id   = IC.index_id
      JOIN sys.columns AS C
        ON IC.object_id = C.object_id
      JOIN sys.tables AS T
        ON IC.object_id = T.object_id
     WHERE I.object_id  = OBJECT_ID('produtos', 'U')
       AND I.name       = 'TXPRDRED'
       AND IC.column_id = C.column_id;
    
    
       --Desabilitar o indice se realmente necessário
      ALTER  INDEX TXPRDRED ON dbo.produtos DISABLE 


    Wesley Neves


    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    • Editado Wesley Neves quarta-feira, 16 de maio de 2018 12:57 complemento
    • Marcado como Resposta CHARLES.PTU sexta-feira, 18 de maio de 2018 11:22
    quarta-feira, 16 de maio de 2018 12:31
  • O índice em questão está validando uma regra de negócio onde os campos envolvidos no mesmo não podem conter registros duplicados.

    Rafael, é por isso que sou a favor de implementar determinadas regras de negócio no banco de dados, pois isto garante a integridade dos dados para casos como o acima. É claro que depende do contexto da aplicação, mas para bases de dados corporativas é necessário o máximo de atenção à consistência das informações.

    e-mail       José Diz     Belo Horizonte, MG - Brasil



    sexta-feira, 18 de maio de 2018 11:02
    Moderador

Todas as Respostas

  • Qual os campos envolvidos na chave única que sua tabela tem?
    terça-feira, 15 de maio de 2018 20:55
  • INSERT INTO dbo.TPRODUTO (CODCOLPRD, IDPRD, CODIGOPRD, NOMEFANTASIA, TIPO, DESCRICAO, INATIVO, PESAVEL, DATAULTALTERACAO, CODUSUARIO, QTDEVOLUME, ID, RECMODIFIEDBY, RECMODIFIEDON)

    OS UNICOS QUE SÃO OBRIGATORIOS SÃO OS IDPRD E NOME FANTASIA.


    CharlesTI.

    terça-feira, 15 de maio de 2018 23:32
  • Qual a versão do SQL Server?

    Poderia executar o código abaixo e transcrever o resultado para este tópico, de modo a conhecermos os índices da tabela TPRODUTO?

    -- código #1
    USE nome_do_banco; EXECUTE sp_helpindex TPRODUTO;

    Verifique o que está definido para TXPRDRED, pois é ele que está protegendo os dados de atualizações erradas. E, pelo valor dos valores rejeitados,

       (0, <NULL>)

    eu diria que já tem alguma informação errada incluída na tabela.

    No momento da execução da primeira linha, como estava configurado IDENTITY_INSERT?


    e-mail       José Diz     Belo Horizonte, MG - Brasil



    terça-feira, 15 de maio de 2018 23:48
    Moderador
  • Boa tarde.

    Estou tentando fazer uma inserção manual de urgência no banco de dados mas o sistema está dando erro ao inserir.

    Alguém já passou por este erro? Estava dando uma olhada aqui e a Microsoft manda atualizar o windows server

    https://support.microsoft.com/pt-br/help/2962767/fix-cannot-insert-duplicate-key-error-occurs-when-you-update-a-table-b

    Mas estou fazendo este procedimento local em minha máquina.


    CharlesTI.

      Esse problema é muito simples  ,existe na sua tabela um UNIQUE INDEX  chamado TXPRDRED

    Comforme especificação , o UNIQUE INDEX ,só pode ter um valor NULO, e e esse o erro , a tentativa de inserir mais de um valor nulo para a coluna , 

    seque uma demostração

    DROP TABLE  IF EXISTS produtos
    
    CREATE TABLE produtos
    (
     idproduto INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
     Nome VARCHAR(100),
     Codigo VARCHAR(10) 
    )
    
    
    CREATE UNIQUE NONCLUSTERED INDEX TXPRDRED ON dbo.produtos(Codigo)
    
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 1',NULL );
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 2','P2' );
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 3','P3' );
    
    --So existe uma linha
    SELECT * FROM dbo.produtos AS P
    WHERE P.Codigo IS NULL
    
    
    --Essa linha gera o erro
    INSERT INTO dbo.produtos (Nome,Codigo)VALUES ('Produto 4',NULL );
    --Cannot insert duplicate key row in object 'dbo.produtos' with unique index 'TXPRDRED'. The duplicate key value is (<NULL>).
    
    
    --Identificar a coluna indexada
    
    
    SELECT I.object_id,
           [Nome Indice] = I.name,
           I.type_desc,
           I.is_unique,
           tabela = T.name,
           [Coluna Indice] = IC.column_id,
           IC.key_ordinal,
           IC.is_included_column,
           [Nome Coluna Indexada] = C.name,
           [Coluna Tabela] = C.column_id,
           C.system_type_id
      FROM sys.indexes AS I
      JOIN sys.index_columns AS IC
        ON I.object_id  = IC.object_id
       AND I.index_id   = IC.index_id
      JOIN sys.columns AS C
        ON IC.object_id = C.object_id
      JOIN sys.tables AS T
        ON IC.object_id = T.object_id
     WHERE I.object_id  = OBJECT_ID('produtos', 'U')
       AND I.name       = 'TXPRDRED'
       AND IC.column_id = C.column_id;
    
    
       --Desabilitar o indice se realmente necessário
      ALTER  INDEX TXPRDRED ON dbo.produtos DISABLE 


    Wesley Neves


    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    • Editado Wesley Neves quarta-feira, 16 de maio de 2018 12:57 complemento
    • Marcado como Resposta CHARLES.PTU sexta-feira, 18 de maio de 2018 11:22
    quarta-feira, 16 de maio de 2018 12:31
  • Charles,Você está tentando incluir um produto manualmente via banco de dados. Entendo que seria importante validar a regra de negócio envolvida com sua aplicação.

    O índice em questão está validando uma regra de negócio onde os campos envolvidos no mesmo não podem conter registros duplicados.

    Sendo assim, acho importante validar com o fornecedor do produto a regra de inserção deste registro para evitar inconsistências.

    Att,


    Rafael Cardoso de Araújo MCTS - SQL Server 2005

    quarta-feira, 16 de maio de 2018 18:50
  • O índice em questão está validando uma regra de negócio onde os campos envolvidos no mesmo não podem conter registros duplicados.

    Rafael, é por isso que sou a favor de implementar determinadas regras de negócio no banco de dados, pois isto garante a integridade dos dados para casos como o acima. É claro que depende do contexto da aplicação, mas para bases de dados corporativas é necessário o máximo de atenção à consistência das informações.

    e-mail       José Diz     Belo Horizonte, MG - Brasil



    sexta-feira, 18 de maio de 2018 11:02
    Moderador