Restrições exclusivas e restrições de verificação
Restrições UNIQUE e 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 tópico inclui as seções a seguir.
Restrições UNIQUE
Restrições CHECK
Tarefas relacionadas
Restrições UNIQUE
Restrições são regras que o Mecanismo de Banco de Dados do SQL Server impõe a 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 impõem exclusividade, use a restrição UNIQUE em vez da restrição PRIMARY KEY quando for impor a exclusividade de uma coluna, ou uma combinação de colunas, que não seja uma chave primária.
Diferente 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, só 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.
[Início]
Restrições CHECK
Restrições CHECK impõe 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 (Booleana) que retorne TRUE ou FALSE com base em operadores lógicos. 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. A expressão lógica seria o 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 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.
As restrições CHECK 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, enquanto que 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, 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 a 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 int MyColumn 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. Uma restrição CHECK funciona no nível de linha. 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.
[Início]
Tarefas relacionadas
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, haverá falha na alteração de esquema. |
Tarefa |
Tópico |
---|---|
Descreve como criar uma restrição exclusiva. |
|
Descreve como modificar uma restrição exclusiva. |
|
Descreve como excluir uma restrição exclusiva. |
|
Descreve como desabilitar uma restrição de verificação quando um agente de replicação insere ou atualiza dados em sua tabela. |
|
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. |
|
Descreve como excluir uma restrição de verificação. |
|
Descreve como exibir as propriedades de uma restrição de verificação. |
[Início]