Restrições exclusivas e restrições de verificação

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Restrições UNIQUE e restrições CHECK são dois tipos de restrições que podem ser usadas para impor a integridade de dados em tabelas do SQL Server. Esses são objetos de banco de dados importantes.

Este artigo inclui as seções a seguir.

Restrições UNIQUE

Restrições são regras que o Mecanismo de Banco de Dados do SQL Server impõe para você. Por exemplo, você pode usar as restrições UNIQUE para garantir que não há valores duplicados inseridos em colunas específicas que não participam de uma chave primária. Embora a restrição UNIQUE e a restrição PRIMARY KEY imponham exclusividade, use a restrição UNIQUE em vez da restrição PRIMARY KEY ao impor a exclusividade de uma coluna (ou uma combinação de colunas), que não seja uma chave primária.

Ao contrário das restrições PRIMARY KEY, as restrições UNIQUE permitem o valor NULL. Porém, como com qualquer valor que participa de uma restrição UNIQUE, somente um valor nulo é permitido por coluna. Uma restrição UNIQUE pode ser referenciada por uma restrição FOREIGN KEY.

Quando uma nova restrição UNIQUE é adicionada a uma coluna ou colunas existentes em uma tabela, o Mecanismo de Banco de Dados, por padrão, examina os dados existentes nas colunas para certificar-se de que todos os valores são únicos. Se uma restrição UNIQUE for adicionada a uma coluna que tem valores duplicados, o Mecanismo de Banco de Dados retornará um erro e não adicionará a restrição.

O Mecanismo de Banco de Dados cria automaticamente um índice UNIQUE para impor a exclusividade do requisito da restrição UNIQUE. Portanto, se houver uma tentativa de inserir uma linha duplicada, o Mecanismo de Banco de Dados retornará uma mensagem de erro indicando que a restrição UNIQUE foi violada e a linha não será adicionada à tabela. A menos que um índice clusterizado seja explicitamente especificado, um índice não clusterizado e único é criado por padrão para impor a restrição UNIQUE.

Restrições CHECK

As restrições CHECK impõem integridade de domínio limitando os valores aceitos por uma ou mais colunas. Você pode criar uma restrição CHECK com qualquer expressão lógica (booliana) que retorne TRUE ou FALSE com base em operadores lógicos. Por exemplo, o intervalo de valores para uma coluna salary pode ser limitado pela criação de uma restrição CHECK que permite que os dados variem somente entre US$ 15.000 e US$ 100.000. Isto evita que salários sejam digitados além do intervalo de salário regular. A expressão lógica seria a seguinte: salary >= 15000 AND salary <= 100000.

Você pode aplicar várias restrições CHECK a uma única coluna. Você também pode aplicar uma única restrição CHECK a várias colunas criando-as ao nível de tabela. Por exemplo, uma restrição CHECK de várias colunas poderia ser usada para confirmar que qualquer linha com o valor de coluna country_region igual a USA também tem um valor de dois caracteres na coluna state. Isto permite que várias condições sejam verificadas em um local.

As restrições CHECK são semelhantes às restrições FOREIGN KEY pelo fato de controlarem os valores colocados em uma coluna. A diferença está em como elas determinam quais valores são válidos: as restrições FOREIGN KEY obtêm uma lista de valores válidos de uma outra tabela, enquanto as restrições CHECK determinam valores válidos de uma expressão lógica.

Cuidado

Restrições que incluem conversão de tipo de dados implícita ou explícita podem causar falhas em certas operações. Por exemplo, essas restrições definidas em tabelas que são fontes de opção de partição podem causar falha na operação ALTER TABLE...SWITCH. Evite a conversão de tipo de dados em definições de restrição.

Limitações das restrições CHECK

As restrições CHECK rejeitam valores avaliados como FALSE. Porque valores nulos são avaliados para UNKNOWN, a sua presença em expressões pode anular uma restrição. Por exemplo, suponha que você coloque uma restrição em uma coluna int MyColumn especificando que MyColumn possa conter apenas o valor 10 (MyColumn=10). Se você inserir o valor NULL em MyColumn, o Mecanismo de Banco de Dados inserirá NULL e não retornará um erro.

Uma restrição CHECK retorna TRUE quando a condição que está verificando não é FALSE para alguma linha na tabela. Uma restrição CHECK funciona no nível de linha. Se a tabela acabou de ser criada e ainda não tem nenhuma linha, qualquer restrição CHECK nessa tabela é considerada válida. Esta situação pode produzir resultados inesperados, como no exemplo seguinte.

CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO

CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
    DECLARE @retval INT;
    SELECT @retval = COUNT(*)
    FROM CheckTbl;

    RETURN @retval;
END;
GO

ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO

A restrição CHECK que está sendo adicionada especifica que deve haver pelo menos uma linha na tabela CheckTbl. Entretanto, como não há nenhuma linha na tabela contra a qual verificar a condição desta restrição, a instrução ALTER TABLE obtém êxito.

As restrições CHECK não são validadas em instruções DELETE. Portanto, executar instruções DELETE em tabelas com certos tipos de restrições de verificação pode produzir resultados inesperados. Por exemplo, considere as instruções a seguir executadas na tabela CheckTbl.

INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;

A instrução DELETE tem êxito, embora a restrição CHECK especifique qual tabela CheckTbl deva ter pelo menos 1 linha.

Observação

Se a tabela for publicada para replicação, você precisará fazer alterações no esquema usando a instrução Transact-SQL ALTER TABLE ou o SMO (SQL Server Management Objects). Ao fazer alterações no esquema com o Criador de Tabelas ou com o Criador do Diagrama de Banco de Dados, ele tenta descartar e recriar a tabela. Não é possível descartar objetos publicados, portanto, a alteração do esquema falhará.

Tarefa Artigo
Descreve como criar uma restrição UNIQUE. Criar restrições UNIQUE
Descreve como modificar uma restrição exclusiva. Modificar restrições exclusivas
Descreve como excluir uma restrição exclusiva. Excluir restrições exclusivas
Descreve como criar uma restrição CHECK. Criar restrições de verificação
Descreve como desabilitar uma restrição de verificação quando um agente de replicação insere ou atualiza dados em sua tabela. Desabilitar verificação de restrições para replicação
Descreve como desabilitar uma restrição de verificação quando dados são adicionados, atualizados ou excluídos de uma tabela. Desabilitar restrições de verificação com instruções INSERT e UPDATE
Descreve como alterar a expressão de restrição ou as opções que habilitam ou desabilitam a restrição para condições específicas. Modificar restrições de verificação
Descreve como excluir uma restrição de verificação. Excluir restrições de verificação
Descreve como exibir as propriedades de uma restrição de verificação. Restrições exclusivas e restrições de verificação