Criando índices exclusivos

A criação de um índice exclusivo garante que qualquer tentativa de duplicar valores chave não tenha êxito. Não existe nenhuma diferença significativa entre criar uma restrição UNIQUE e criar um índice exclusivo que seja independente de uma restrição. A validação de dados ocorre da mesma maneira, e o otimizador de consultas não diferencia entre um índice exclusivo criado por uma restrição ou manualmente criado. Entretanto, você deve criar uma restrição UNIQUE na coluna quando o objetivo for a integridade dos dados. Isto faz com que o objetivo do índice seja claro.

Implementações comuns

Os índices exclusivos são implementados das seguintes maneiras:

  • Restrição PRIMARY KEY ou UNIQUE

    Quando se cria uma restrição PRIMARY KEY, é criado automaticamente um índice clusterizado exclusivo na coluna ou a coluna é automaticamente criada se não existir um índice clusterizado na tabela e você não especificar um índice não clusterizado exclusivo. A coluna de chave primária não pode permitir valores NULL.

    Quando se cria uma restrição UNIQUE, é criado, por padrão, um índice não clusterizado exclusivo para impor uma restrição UNIQUE por padrão. Você pode especificar um índice clusterizado exclusivo caso ainda não exista um índice clusterizado na tabela.

    Para obter mais informações, consulte Restrições PRIMARY KEY e Restrições UNIQUE.

  • Índice independente de restrição

    Vários índices não clusterizado exclusivos podem ser definidos em uma tabela.

    Para obter mais informações, consulte CREATE INDEX (Transact-SQL).

  • Exibição indexada

    Para criar uma exibição indexada, um índice clusterizado exclusivo é definido em uma ou mais colunas de exibição. A exibição é executada (materializada) e o conjunto de resultados é armazenado no nível folha do índice da mesma forma que os dados da tabela são armazenados em um índice clusterizado. Para obter mais informações, consulte Criando exibições indexadas.

Resolvendo problemas de valor duplicado

Um índice exclusivo ou restrição não podem ser criados se existirem valores duplicados nas colunas chave. Por exemplo, se você quiser criar um índice exclusivo composto nas colunas FirstName e LastName, mas existirem duas linhas na tabela que contêm os valores 'Jane' e 'Smith' nas colunas FirstName e LastName, o índice exclusivo não poderá ser criado. O problema pode ser resolvido em uma das seguintes maneiras:

  • Adicione ou remova colunas na definição do índice para criar um composto exclusivo. No exemplo anterior, adicionar uma coluna MiddleName à definição do índice poderia resolver o problema de duplicação.

  • Se os valores duplicados forem resultado de erros de entrada de dados, corrija manualmente os dados e, em seguida, crie o índice ou a restrição.

Usando a opção IGNORE_DUP_KEY para controlar valores duplicados

Quando você cria ou modifica um índice exclusivo ou restrição exclusiva, você pode definir a opção IGNORE_DUP_KEY como ON ou OFF. Essa opção especifica a resposta de erro quando uma operação de inserção tenta inserir valores da chave duplicada em um índice exclusivo. A opção IGNORE_DUP_KEY aplica-se apenas às operações de inserção depois que o índice é criado ou recriado. A opção não tem nenhum efeito quando CREATE INDEX, ALTER INDEX ou UPDATE é executado. O padrão é OFF.

  • ON
    Uma mensagem de aviso ocorrerá quando valores de chave duplicada forem inseridos em um índice exclusivo. Haverá falha somente nas linhas que violarem a restrição de exclusividade.

  • OFF
    Ocorre uma mensagem de erro quando os valores da chave duplicada são inseridos em um índice exclusivo. A operação INSERT inteira será revertida.

Por exemplo, se uma única instrução inserir 20 linhas em uma tabela com um índice exclusivo, e 10 dessas linhas contiverem valores de chave duplicados, por padrão, todas as 20 linhas serão rejeitadas. No entanto, se a opção de índice IGNORE_DUP_KEY estiver definida como ON, somente os 10 valores de chave duplicados serão rejeitados; os outros 10 valores de chave não duplicados serão inseridos na tabela.

IGNORE_DUP_KEY não pode ser definido como ON para índices criados em uma exibição, índices não exclusivos, índices XML, índices espaciais e índices filtrados.

Para exibir IGNORE_DUP_KEY, use sys.indexes.

Na sintaxe compatível com versões anteriores, WITH IGNORE_DUP_KEY é equivalente a WITH IGNORE_DUP_KEY = ON.

Processando valores NULL

Para fins de indexação, valores NULL são comparados como iguais. Portanto, você não pode criar um índice exclusivo ou restrição UNIQUE, se os valores chave forem NULL em mais de uma linha. Selecione colunas definidas como NOT NULL quando escolher colunas para um índice exclusivo ou restrição exclusiva.

Requisitos para espaço em disco

O processo de determinar os requisitos de espaço em disco para índices exclusivos é igual ao processo para índices clusterizados e não clusterizados. Para obter informações sobre requisitos de espaço em disco para índices, consulte Determinando requisitos de espaço em disco de índice.

Para criar um índice quando você cria uma tabela

Para criar um índice em uma tabela existente