Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Insight sobre as restrições exclusivas do SQL Server

O que são restrições de chave exclusivas?


Uma restrição exclusiva é uma regra que restringe as entradas de coluna a exclusivas. Em outras palavras, esse tipo de restrição impede a inserção de duplicatas em uma coluna. Uma restrição exclusiva é um dos instrumentos para impor a integridade dos dados em um banco de dados SQL Server. Como uma tabela pode ter apenas uma chave primária, você pode usar uma restrição exclusiva para impor a exclusividade de uma coluna ou uma combinação de colunas que não constituem uma chave primária.

A criação de uma restrição exclusiva em uma coluna cria automaticamente um índice exclusivo. Dessa forma, o SQL Server implementa o requisito de integridade da restrição exclusiva. Portanto, ao tentar inserir um valor duplicado em uma coluna, na qual uma restrição exclusiva é definida, o Mecanismo de Banco de Dados detectará a violação de restrição exclusiva e emitirá um erro correspondente. Como resultado, a linha com os valores duplicados não será adicionada a uma tabela.


Criando uma restrição exclusiva


A consulta de exemplo a seguir cria o arquivo Alunos tabela e uma restrição exclusiva no Login coluna para que não haja alunos com o mesmo login.
CREATE TABLE Alunos (Login CHAR NOT NULL,CONSTRAINT AK_Student_Login UNIQUE (Login));GO

Se os Alunos tabela já existe, você pode usar a consulta de exemplo a seguir para criar a restrição exclusiva.
ALTER TABLE AlunosADD CONSTRAINT AK_Student_Login UNIQUE (Login);GO

Observe que, quando você adiciona uma restrição exclusiva a uma tabela existente, o Mecanismo de Banco de Dados verifica se a coluna à qual a restrição é adicionada inclui valores duplicados. Se houver tais valores, a restrição não será adicionada retornando um erro.

Agora, para verificar se a restrição exclusiva foi realmente adicionada, execute as seguintes instruções:
EXEC sp_helpindex AlunosEXEC sp_helpconstraint Alunos

Aqui está a restrição que criamos:


Criando uma restrição exclusiva no SQL Server Management Studio


Digamos que precisamos definir uma restrição exclusiva no Login coloque na coluna Alunos tabela.

1. No Explorador de Objetos , clique com o botão direito do mouse em Alunos tabela e clique em Design .

2. Clique com o botão direito do mouse no Designer de tabela e escolha Índices/Chaves…

3. Nos Índices/Chaves janela, clique em Adicionar .

4. Na seção Geral seção, clique em Colunas e, em seguida, clique no botão de reticências. Nas Colunas de Índice janela, selecione a(s) coluna(s) que deseja incluir na restrição exclusiva.

5. Na seção Geral seção, clique em Tipo e selecione Chave exclusiva da lista suspensa.

6. Sob a Identidade seção, especifique o nome da restrição (no nosso caso, AK_Student_Login ) e clique em Fechar para salvar a restrição recém-criada.



Agora, se você for para Alunos tabela no Explorador de Objetos e clique em Índices pasta, você verá que a tabela contém uma chave primária e uma restrição exclusiva AK_Student_Login .


Como as restrições exclusivas são diferentes das chaves primárias?


Semelhante a uma restrição exclusiva, uma chave primária também é usada para impor a integridade dos dados em uma tabela. Mas o objetivo principal de uma chave primária é identificar exclusivamente cada registro em uma tabela e implementar relacionamentos adequados entre tabelas em um banco de dados. Uma chave primária é necessária em 99% das tabelas para permitir o acesso adequado às linhas da tabela. Pode haver apenas uma chave primária por tabela definida em uma ou mais colunas.

As restrições exclusivas são usadas especificamente para evitar que valores duplicados sejam inseridos em uma coluna. Pode haver várias colunas com restrições exclusivas ou pode não haver nenhuma restrição exclusiva definida em uma tabela. Eles não são obrigatórios para uma tabela, ao contrário das chaves primárias.

Digamos que temos os Alunos tabela contendo informações pessoais sobre cada aluno de uma universidade. A tabela inclui o StudentID coluna que é uma chave primária e armazena um ID exclusivo de cada aluno específico. Essa coluna de chave primária é usada para identificar exclusivamente cada aluno em uma universidade.

Ao mesmo tempo, os Alunos tabela tem colunas como E-mail , Número de Previdência Social e Login e cada uma dessas colunas deve armazenar valores exclusivos. Como já existe uma chave primária na tabela, usaremos restrições exclusivas para impor exclusividade a essas colunas. Assim, uma tabela pode ter muitas restrições exclusivas e apenas uma chave primária.

Outra coisa que difere uma restrição exclusiva de uma chave primária é que a chave primária não permite nenhum NULL valores em uma coluna, enquanto uma coluna com uma restrição exclusiva pode incluir um NULL valor, mas apenas um, pois o SQL Server interpreta dois valores NULL como os mesmos valores.

Suponha que uma restrição exclusiva seja criada no E-mail coluna dos Alunos tabela. Vamos tentar inserir duas linhas ambas com NULL s no E-mail Campos:
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')GO

Recebemos a seguinte mensagem de erro:



Bem, esse é um comportamento previsível, pois valores duplicados, mesmo que sejam NULLs, não são permitidos pela restrição exclusiva.

Restrição exclusiva x índice exclusivo


Embora a restrição exclusiva e o índice exclusivo sejam duas entidades de banco de dados não relacionadas completamente diferentes, elas têm o mesmo objetivo e o mesmo impacto no desempenho do SQL Server. Ambos garantem a exclusividade de dados em uma coluna.

No entanto, ao contrário do índice exclusivo, você não pode especificar as opções IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX e STATISTICS_NORECOMPUTE para a restrição exclusiva nas instruções ALTER TABLE.

Quando você cria uma restrição exclusiva em uma coluna, o SQL Server cria automaticamente um índice exclusivo na coluna, é exatamente assim que esse recurso é implementado no SQL Server.



Para excluir o índice exclusivo, você precisa primeiro descartar a restrição exclusiva correspondente e isso excluirá automaticamente o índice exclusivo subjacente.

A declaração a seguir eliminará o AK_Student_Login limitação:
ALTER TABLE Alunos DROP CONSTRAINT AK_Student_Login; IR

Você pode ver que soltando o AK_Student_Login restrição exclusiva exclui seu índice correspondente.



Isso foi fácil, agora você pode inserir valores idênticos no Login coluna.

Desativando restrição exclusiva


Existe uma opção que desativa uma restrição exclusiva. A consulta a seguir deve desabilitar todas as restrições de tabela:
ALTER TABLE AlunosNOCHECK CONSTRAINT ALLGO

Executada a consulta, vamos agora tentar inserir um registro duplicado:
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')GO

O que obtemos é a mensagem de violação de restrição exclusiva:



Assim, parece que ALTER TABLE NOCHECK CONSTRAINT ALL GO não funciona para restrições exclusivas no SQL Server.

No entanto, lembre-se de que existe um índice exclusivo sob o capô de cada restrição exclusiva e devemos ser capazes de desabilitar um índice exclusivo. No nosso caso, o AK_Student_Email restrição exclusiva criou o AK_Student_Email correspondente índice exclusivo no E-mail coluna. Vamos usar a seguinte consulta para desativar o AK_Student_Email índice único primeiro.
ALTER INDEX AK_Student_Email ON StudentsDISABLE;

A consulta foi concluída com sucesso, então agora vamos inserir dois registros com Email duplicado campos em Alunos tabela.
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')GO 
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')GO 


Funciona! Os registros foram inseridos na tabela! Agora sabemos como contornar esse problema de “desativação” com uma restrição única.

Para habilitar o índice, use a seguinte consulta:
ALTER INDEX AK_Student_Email ON StudentsREBUILD;

Conclusão


As restrições de chave exclusivas permitem que os desenvolvedores de DBAs e SQL imponham e preservem a exclusividade de dados nas colunas da tabela, bem como apliquem determinados requisitos de negócios para integridade de dados. Basicamente, não há diferença substancial no comportamento entre uma restrição exclusiva e um índice exclusivo, exceto o fato de que a restrição exclusiva não pode ser desabilitada diretamente e certas opções de criação de índice não estão disponíveis para restrições exclusivas na instrução ALTER TABLE.

Espero que este artigo tenha sido interessante. Você pode fazer perguntas, deixar comentários e sugestões sobre este artigo.

Veja também: VERIFICAR Restrições no SQL Server