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á.
Tarefas relacionadas
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 |