Back to Tutorial do Servidor SQL Para Principiantes e Profissionais
/div>
SQL Server Unique Index
Neste artigo, vou discutir o SQL Server Unique Index com exemplos. Quando criamos um índice do SQL Server utilizando a opção Unique, então chama-se um Índice Único do SQL Server. Então a(s) coluna(s) em que o índice único é criado não permitirá valores duplicados, ou seja, funciona como uma restrição única.
O Índice Único do SQL Server garante que a coluna em que o índice é criado não aceitará quaisquer valores duplicados. Por favor, leia os seguintes artigos que são necessários para compreender o SQL Server Unique Index.
Índice do Servidor SQL
Índice único no Servidor SQL
Índices não-Clusados no Servidor SQL
Deixe-nos compreender o Índice Único do Servidor SQL com um exemplo.
Vamos utilizar a seguinte tabela de Empregados. Utilizar o seguinte SQL Script para criar e preencher a tabela de Empregados com dados de teste.
/div>
Como marcamos a coluna Id como a coluna Chave Primária na tabela Empregados, por defeito é criado um índice agrupado único na coluna Id com Id como a chave Índice. Para verificar se um índice agrupado único é criado ou não, utilize o procedimento armazenado no sistema sp_helpindex, conforme mostrado abaixo.
sp_helpindex Empregados
Do diagrama acima, mostra claramente que é criado um índice agrupado único na coluna Id da tabela Empregados. Como temos um ÍNDICE ÚNICO CLUSTERO na coluna Id da tabela Empregados, qualquer tentativa de duplicar os valores chave, ou seja, os valores da coluna Id da tabela Empregados irá lançar um erro.
Tentemos inserir dois registos com os mesmos valores Id como mostrado abaixo.
INSERT INTO VALORES dos Funcionários(1,’Pranaya’, ‘Rout’,4500,’Macho’,’Mumbai’)
INSERT INTO VALORES dos Funcionários(1,’Anurag’, ‘Mohanty’,2500,’Macho’,’Delhi’)
Quando tentamos inserir os dois registos acima, isso dá-nos o erro abaixo que assegura que não podemos inserir valores chave duplicados quando existe um índice único no SQL Server.
‘Violação do constrangimento de chave PRIMÁRIA ‘PK__Employee__3214EC0775FF9526’. Não é possível inserir chave duplicada no objecto ‘dbo.Employees’. O valor da chave duplicada é (1)’.
Agora vamos tentar largar o índice Unique Clustered na coluna Id usando o Comando DROP como mostrado abaixo.
DROP INDEX Empregados.PK__Employee__3214EC0775FF9526
Quando tentamos executar o comando DROP INDEX acima, dá-nos o erro abaixo
‘Não é permitido um DROP INDEX explícito no índice ‘Employees.PK__Employee__3214EC0775FF9526′. Está a ser utilizado para a aplicação da restrição PRIMÁRIA KEY.’
Então, a mensagem de erro acima referida prova que o servidor SQL usa internamente o índice UNIQUE para impor a unicidade dos valores e a chave primária.
Para ver a chave primária e o índice, expanda a pasta de chaves na janela do explorador de objectos, e pode ver a restrição da chave primária. Da mesma forma, expanda a pasta indexes na janela do explorador de objectos, e pode ver o índice agrupado único como mostrado no diagrama abaixo.
Como pode ver no explorador de objectos, mostra apenas a palavra agrupada. Para confirmar se é ou não um índice UNIQUE, clique com o botão direito do rato sobre o índice e seleccione propriedades. A janela de propriedades mostra a caixa de verificação UNIQUE a ser seleccionada, como mostra o diagrama abaixo.
DELETE Índice agrupado
Não podemos apagar o Unique Clustered Index usando o comando DROP, mas o SQL Server permite-nos apagar o UNIQUE CLUSTERED INDEX do explorador de objectos. Por isso, clique com o botão direito no índice, e depois seleccione a opção DELETE e finalmente clique em OK. Pode ver que juntamente com o índice UNIQUE, a restrição da chave primária é também eliminada.
Agora, vamos tentar inserir alguns valores duplicados para a coluna ID dos Funcionários e pode ver que as linhas são inseridas na tabela sem qualquer erro de violação da chave primária.
INSERT INTO VALORES dos Funcionários(2,’Priyanka’, ‘Dwegaan’,4500,’Feminino’,’Mumbai’)
INSERT INTO VALORES dos Funcionários(2,’Preety’, ‘Tiwary’,2500, ‘FEmale’, ‘Delhi’)
No momento de inserir os dois registos acima, verifique a tabela de Empregados como se mostra abaixo.
SELECT * FROM Employees
Output:
Por isso, isto prova que o índice UNIQUE no SQL Server é utilizado para impor a unicidade dos valores e a restrição chave primária.
A UNIQUENESS é uma propriedade de um Índice no SQL Server e tanto os índices CLUSTERED como os NÃO CLUSTERED podem ser criados como UNIQUE.
NOTE:
Não podemos criar um índice único numa única coluna se essa coluna contiver NULL em mais do que uma linha. Da mesma forma, não podemos criar um índice único em várias colunas se a combinação de colunas contiver NULL em mais do que uma linha. Estes são tratados como valores duplicados para efeitos de indexação.
Vamos criar um Índice Único Não-Clustrado nas colunas PrimeiroNome e ÚltimoNome da tabela Empregados
CREATE UNIQUE NONCLUSTERED INDEX UIX_Employees_FastNamee_LastName On Employees(FastName, LastName)
O índice único não agrupado acima garante que nenhuma 2 entradas no índice tenham os mesmos nomes rápidos e apelidos.
No artigo Restrição Única, já discutimos que uma Restrição Única no SQL Server pode ser usada para impor a unicidade dos valores, através de uma ou mais colunas.
NOTE: A Restrição Única no SQL Server pode ser ou única agregada ou única não agregada. Enquanto se cria um índice no SQL Server, se agrupado ou não agrupado não é especificado por defeito é não agrupado.
Quais são as diferenças entre UNIQUE Constraints e UNIQUE Index?
Não há grandes diferenças entre uma restrição única e um índice único no SQL Server. De facto, quando adicionamos um constrangimento único, é criado um índice único nos bastidores.
Para compreender isto, vamos adicionar uma restrição única na coluna Cidade da tabela Empregados
TABELA ALTERA Empregados ADD CONSTRAINT UQ_Emplyees_City UNIQUE (City)
Agora, quando executamos a consulta acima indicada, dá-nos o erro abaixo.
A declaração CREATE UNIQUE INDEX terminou porque foi encontrada uma chave duplicada para o nome do objecto ‘dbo.Employees’ e o nome do índice ‘UQ_Emplyees_City’. O valor da chave duplicada é (Mumbai).
Isto porque já temos valores duplicados na coluna Cidade da tabela Empregados e por isso não permite criar Índice Único na Coluna Cidade.
Então vamos truncar primeiro a tabela e depois criar o Índice como se mostra abaixo.
Tabela de ENDEREÇO Funcionários
Tabela de ENDEREÇO Funcionários ADICIONAR CONSTRUTURA UQ_Emplyees_City UNIQUE (Cidade)
Agora, a declaração executada com sucesso.
Neste ponto, pode esperar que seja criada uma restrição única dentro da pasta de restrições. Actualize e expanda a pasta de restrições na janela do explorador de objectos e pode ver que a restrição não está presente nesta pasta. Agora, actualize e expanda a pasta ‘indexes’ e na pasta indexes, pode ver um índice ÚNICO NÃO-CLUSTADO com o nome UQ_Employees_City, como se mostra abaixo.
Também pode verificar as restrições disponíveis de uma tabela, utilizando o procedimento de armazenamento do sistema SP_HELPCONSTRAINT como mostrado abaixo
EXECUTE SP_HELPCONSTRAINT Empregados
Dar-nos-á o resultado abaixo.
Quando criamos uma Restrição Única no SQL Server, ela cria de facto um índice ÚNICO por detrás da cena. Assim, um índice UNIQUE no SQL Server pode ser criado explicitamente usando a instrução CREATE INDEX ou indirectamente usando uma restrição UNIQUE.
Quando se deve criar uma restrição única sobre um índice único?
Para tornar claras as intenções, criar uma restrição única quando a integridade dos dados é o objectivo. Isto torna o objectivo do índice muito claro. Em qualquer dos casos, os dados são validados da mesma maneira, e o optimizador de consultas não diferencia entre um índice único criado por uma restrição única ou criado manualmente.
NOTE:
Quando criamos uma restrição PRIMÁRIA KEY no SQL Server, um índice agrupado único na coluna ou colunas é automaticamente criado se um índice agrupado na tabela ainda não existir e não especificarmos um índice único não agrupado.
Quando criamos uma restrição UNIQUE no SQL Server, um índice único não agrupado é criado automaticamente para impor uma restrição UNIQUE por defeito. Pode especificar um índice agrupado único se um índice agrupado na tabela ainda não existir.
Não podemos criar uma restrição UNIQUE ou um índice UNIQUE no SQL Server numa tabela existente se a tabela contiver valores duplicados nas colunas chave. Para resolver isto, é necessário remover as colunas chave da definição do índice ou eliminar ou actualizar os valores duplicados.
Por defeito, não são permitidos valores duplicados nas colunas chave, quando se tem um índice ou restrição única. Por exemplo, se tentar inserir 10 filas, das quais 5 filas contêm duplicados, então todas as 10 filas são rejeitadas. Contudo, se eu quiser que apenas as 5 linhas duplicadas sejam rejeitadas e aceitar as 5 linhas não duplicadas, então posso usar a opção IGNORE_DUP_KEY. Um exemplo de utilização da opção IGNORE_DUP_KEY é mostrado abaixo.
CREATE UNIQUE INDEX IX_Employees_City ON Employees(City) WITH IGNORE_DUP_KEY
Limitações e Restrições
O índice único, A restrição ÚNICO, ou restrição PRIMÁRIA-CHAVE, não pode ser criada se existirem valores chave duplicados nos dados.
Um índice único não incluído pode conter colunas não-chave incluídas
No próximo artigo, discutirei como usar o Índice no GRUPO POR Cláusula no SQL Server com exemplos.