Restrições CHECK

Restrições CHECK impõe integridade de domínio limitando os valores aceitos por uma coluna. Elas são semelhantes a restrições FOREIGN KEY em que eles controlam os valores colocados em uma coluna. A diferença está em como elas determinam quais valores são válidos: restrições FOREIGN KEY obtêm uma lista de valores válidos de uma outra tabela, e restrições CHECK determinam valores válidos de uma expressão lógica que não tem base em dados de uma outra coluna. Por exemplo, o intervalo de valores para uma coluna salário pode ser limitado pela criação de uma restrição CHECK, que apenas permite que os dados variem entre US$ 15.000 e US$ 100.000. Isto evita que salários sejam digitados além do intervalo de salário regular.

Você pode criar uma restrição CHECK com qualquer expressão lógica (Booleana) que retorne TRUE ou FALSE com base em operadores lógicos. Para o exemplo anterior, a expressão lógica é: 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 pode ser usada para confirmar que qualquer linha com o valor de coluna país/região dos EUA também tenha um valor de dois caracteres na coluna estado. Isto permite que várias condições sejam verificadas em um local.

Observação sobre cuidadosCuidado

Restrições que incluem conversão de tipo de dados implícita ou explícita podem causar falhas em certas operações. Por exemplo, tais 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 conversão de tipo de dados em definições de restrição.

Limitações de restrições CHECK

As restrições CHECK rejeitam valores avaliados como FALSE. Porque valores nulos avaliam a 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 intMyColumn especificando que a 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 qualquer linha na tabela. Se a tabela acabou de ser criada e não tiver nenhuma linha, qualquer restrição CHECK nesta 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, porque não há nenhuma linha na tabela para a qual verificar a condição desta restrição, a instrução ALTER TABLE têm êxito.

Restrições CHECK não são validadas durante instruções DELETE. Portanto, executando 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.