MSSQLSERVER_1505
Aplica-se a: SQL Server
Detalhes
Atributo | Valor |
---|---|
Nome do produto | SQL Server |
ID do evento | 1505 |
Origem do Evento | MSSQLSERVER |
Componente | SQLEngine |
Nome simbólico | DUP_KEY |
Texto da mensagem | CREATE UNIQUE INDEX foi encerrado porque uma chave duplicada foi encontrada para o nome do objeto '%.*ls' e o nome do índice '%.*ls'. O valor da chave duplicada é %ls. |
Explicação
Esse erro ocorre quando você tenta criar um índice exclusivo e mais de uma linha da tabela contém o valor duplicado especificado. Um índice exclusivo é criado quando você cria um índice e especifica a palavra-chave UNIQUE ou quando cria uma restrição UNIQUE. A tabela não pode conter linhas que tenham valores duplicados nas colunas definidas no índice ou na restrição.
Considere os dados da seguinte tabela Employee:
Sobrenome | Nome | JobTitle | HireDate |
---|---|---|---|
Walters | Rob | Designer de ferramentas sênior | 2004-11-19 |
Marrom | Kevin | Marketing Assistant | NULO |
Marrom | Jo | Engenheiro de design | NULO |
Walters | Rob | Designer de ferramentas | 2001-08-09 |
Não é possível criar um índice exclusivo com as combinações de coluna LastName ou LastName e FirstName devido aos valores duplicados nas linhas.
Menos óbvia é a possibilidade de ocorrer uma violação de exclusividade na coluna HireDate. Para fins de indexação, valores NULL são comparados como iguais. Portanto, você não poderá criar um índice exclusivo ou uma restrição exclusiva se os valores de chave forem NULL em mais de uma linha. Considerando os dados acima, não é possível criar um índice exclusivo com base nas combinações de coluna HireDate ou LastName e HireDate.
A mensagem de erro 1505 retorna a primeira linha que viola a restrição de exclusividade. Pode haver outras linhas duplicadas na tabela. Para encontrar todas as linhas duplicadas, consulte a tabela especificada e use as cláusulas GROUP BY e HAVING para reportar essas linhas. Por exemplo, a consulta a seguir retorna as linhas da tabela Employee que têm nomes e sobrenomes duplicados.
SELECT Sobrenome, Nome, count(*) FROM dbo. Funcionário GROUP BY Sobrenome, Nome HAVING count(*) > 1;
Ação do usuário
Considere as soluções descritas a seguir.
Adicione ou remova colunas na definição do índice ou da restrição para criar uma composição exclusiva. No exemplo anterior, adicionar uma coluna MiddleName à definição do índice ou da restrição pode resolver o problema de duplicação.
Selecione colunas definidas como NOT NULL quando escolher colunas para um índice exclusivo ou para uma restrição exclusiva. Isso elimina a possibilidade de ocorrer uma violação de exclusividade gerada quando mais de uma linha contiver NULL nos valores de chave.
Se os valores duplicados forem o resultado de erros de entrada de dados, corrija os dados manualmente e, em seguida, crie o índice ou a restrição. Para obter informações sobre como remover linhas duplicadas em uma tabela, examine Remover linhas duplicadas de uma tabela do SQL Server.
Confira também
CREATE INDEX (Transact-SQL)
Criar índices exclusivos
Criar restrições exclusivas