Restrições exclusivas e restrições de verificação
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
banco 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á.
Tarefas relacionadas
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 |