Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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. Esses são objetos de banco de dados importantes.
Este tópico 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 restrições UNIQUE para garantir que nenhum valor duplicado seja inserido em colunas específicas que não participam de uma chave primária. Embora tanto uma restrição UNIQUE quanto uma restrição PRIMARY KEY imponham unicidade, use uma restrição UNIQUE em vez de uma restrição PRIMARY KEY quando você quiser assegurar a unicidade de uma coluna, ou de uma combinação de colunas, que não constitui 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 participe de uma restrição 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 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 UNIQUE for adicionada a uma coluna que tenha 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 o requisito de exclusividade da restrição UNIQUE. Portanto, se uma tentativa de inserir uma linha duplicada for feita, o Mecanismo de Banco de Dados retornará uma mensagem de erro informando que a restrição UNIQUE foi violada e não adicionará a linha à tabela. A menos que um índice clusterizado seja especificado explicitamente, um índice exclusivo não clusterizado é criado por padrão para impor a restrição UNIQUE.
Restrições CHECK
As restrições CHECK impõem a integridade do 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 retorna TRUE ou FALSE com base nos operadores lógicos. Por exemplo, o intervalo de valores de uma coluna salarial pode ser limitado criando uma restrição CHECK que permite apenas dados que variam de US$ 15.000 a 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-a no nível da tabela. Por exemplo, uma restrição CHECK de várias colunas pode ser usada para confirmar que qualquer linha com um valor na coluna country_regionEUA também tem um valor de dois caracteres na coluna estado. Isto permite que várias condições sejam verificadas em um local.
As restrições CHECK são semelhantes às restrições FOREIGN KEY, pois controlam os valores que são colocados em uma coluna. A diferença está em como eles determinam quais valores são válidos: as restrições FOREIGN KEY obtêm a lista de valores válidos de outra tabela, enquanto as restrições CHECK determinam os 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 falha em determinadas operações. Por exemplo, essas restrições definidas em tabelas que são fontes de alternância de partição podem causar um ALTER TABLE... A operação SWITCH falhará. 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 que são avaliados 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 int coluna MyColumn especificando que MyColumn pode conter apenas o valor 10 (MyColumn=10). Se você inserir o valor NULL no 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 nenhuma linha na tabela. Uma restrição CHECK funciona no nível da linha. Se uma tabela que acabou de ser criada não tiver nenhuma linha, qualquer restrição CHECK nesta tabela será 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. No entanto, como não há linhas na tabela em relação à qual verificar a condição dessa restrição, a instrução ALTER TABLE é bem-sucedida.
As restrições CHECK não são validadas durante as instruções DELETE. Portanto, a execução de instruções DELETE em tabelas com determinados 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.
Tarefas Relacionadas
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 SMO (SQL Server Management Objects). Quando as alterações de esquema são feitas usando o Designer de Tabela ou o Designer de Diagrama de Banco de Dados, ele tenta remover e recriar a tabela. Não é possível descartar objetos publicados, portanto, a alteração do esquema falhará.
| Tarefa | Tópico |
|---|---|
| Descreve como criar uma restrição UNIQUE. | 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 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 |