Partilhar via


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

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azurebanco de dados SQL no Microsoft Fabric

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

Este artigo contém as seguintes seções.

Restrições ÚNICAS

As restrições são regras que o Mecanismo de Banco de Dados do SQL Server impõe para você. Por exemplo, você pode usar restrições de UNIQUE para garantir que nenhum valor duplicado seja inserido em colunas específicas que não participem de uma chave primária. Embora uma restrição de UNIQUE e uma restrição de PRIMARY KEY imponham exclusividade, use uma restrição de UNIQUE em vez de uma restrição de PRIMARY KEY quando quiser impor a exclusividade de uma coluna (ou combinação de colunas) que não seja a chave primária.

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

Quando uma restrição de UNIQUE é adicionada a uma coluna ou colunas existentes na tabela, por padrão, o Mecanismo de Banco de Dados examina os dados existentes nas colunas para garantir que todos os valores sejam exclusivos. Se uma restrição de UNIQUE for adicionada a uma coluna com 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 de UNIQUE para impor o requisito de exclusividade da restrição de UNIQUE. Portanto, se for feita uma tentativa de inserir uma linha duplicada, o Mecanismo de Banco de Dados retornará uma mensagem de erro informando que a restrição de UNIQUE foi violada e não adicionará a linha à tabela. A menos que um índice clusterizado seja explicitamente especificado, um índice exclusivo e não clusterizado é criado por padrão para impor a restrição UNIQUE.

Restrições CHECK

CHECK restrições garantem a integridade do domínio, limitando os valores aceites por uma ou mais colunas. Você pode criar uma restrição de CHECK com qualquer expressão lógica (booleana) que retorne TRUE ou FALSE com base nos operadores lógicos. Por exemplo, o intervalo de valores para uma coluna salary pode ser limitado criando uma restrição de CHECK que permite apenas dados que variam de US$ 15.000 a US$ 100.000. Isso impede que os salários sejam inseridos além da faixa salarial regular. A expressão lógica seria a seguinte: salary >= 15000 AND salary <= 100000.

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

CHECK restrições são semelhantes às restrições de FOREIGN KEY no sentido em que controlam os valores que são colocados numa coluna. A diferença está em como eles determinam quais valores são válidos: restrições de FOREIGN KEY obtêm a lista de valores válidos de outra tabela, enquanto restrições de CHECK determinam os valores válidos de uma expressão lógica.

Atenção

Restrições que incluem conversão de tipo de dados implícita ou explícita podem fazer com que determinadas operações falhem. Por exemplo, essas restrições definidas em tabelas que são fontes de comutação de partição podem fazer com que uma operação ALTER TABLE...SWITCH falhe. Evite a conversão de tipo de dados em definições de restrição.

Limitações das restrições CHECK

CHECK restrições rejeitam valores que se avaliam como FALSE. Como os valores nulos são avaliados como UNKNOWN, sua presença em expressões pode substituir uma restrição. Por exemplo, suponha que você coloque uma restrição em uma coluna int MyColumn especificando que MyColumn pode conter apenas o valor 10 (MyColumn=10). Se você inserir o valor NULL em MyColumn, o Mecanismo de Banco de Dados insere NULL e não retorna um erro.

Uma restrição de CHECK retorna TRUE quando a condição que está verificando não é FALSE para nenhuma linha na tabela. Uma restrição de CHECK funciona no nível da linha. Se uma tabela que foi criada não tiver linhas, qualquer restrição de CHECK nessa tabela será considerada válida. Esta situação pode produzir resultados inesperados, como no exemplo a seguir.

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 de CHECK que está sendo adicionada especifica que deve haver pelo menos uma linha na tabela CheckTbl. No entanto, como não há linhas na tabela para verificar a condição dessa restrição, a instrução ALTER TABLE é bem-sucedida.

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

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

A instrução DELETE é bem-sucedida, mesmo que a restrição CHECK especifique que a tabela CheckTbl deve ter pelo menos 1 linha.

Observação

Se a tabela for publicada para replicação, você deverá fazer alterações de esquema usando a instrução Transact-SQL ALTER TABLE ou SQL Server Management Objects (SMO). Quando as alterações de esquema são feitas usando o Designer de Tabela ou o Diagramador de Banco de Dados, o sistema tenta eliminar e recriar a tabela. Não é possível descartar objetos publicados, portanto, a alteração de esquema falhará.

Tarefa Artigo
Descreve como criar uma restrição exclusiva. Criar restrições exclusivas
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 de verificação. 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. Desativar Restrições de Verificação para Replicação
Descreve como desabilitar uma restrição de verificação quando os dados são adicionados, atualizados ou excluídos de uma tabela. Desativar 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