Este artigo demonstra como adicionar um
CHECK
restrição a uma tabela existente. Você pode adicionar uma restrição a uma tabela existente usando o
ALTER TABLE
instrução junto com o ADD CONSTRAINT
argumento. Exemplos abaixo. Exemplo 1 – Criar a Tabela
Primeiro, vamos criar uma tabela para a qual adicionaremos o
CHECK
limitação. CREATE TABLE Event ( EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY, EventName varchar(255) NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, Price smallmoney NOT NULL );
Exemplo 2 – Adicionar uma restrição de nível de coluna
Agora vamos adicionar um
CHECK
restrição ao
Preço
coluna. ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Essa restrição garantirá que o preço seja sempre maior que zero.
Agora que a restrição foi adicionada, veja o que acontece se tentarmos inserir dados inválidos:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Resultado:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.
Neste caso, o
CHECK
restrição especifica que todos os dados no Price
coluna deve ser maior que 0. Em outras palavras, o preço não pode ser zero e não pode ser negativo. Isso é chamado de restrição de nível de coluna , porque é definido em uma única coluna. Aplica-se aos dados em uma coluna.
Exemplo 3 – Adicionar uma restrição de nível de tabela
Agora vamos adicionar um
CHECK
no nível da tabela limitação. Isso verificará os dados em duas colunas. ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
Nesse caso, adiciono uma restrição para garantir que a data de término nunca seja anterior à data de início. Isso está verificando dados em duas colunas e, portanto, é uma restrição de nível de tabela.
Tente inserir um valor inválido:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Resultado:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".
Como esperado, a operação falha porque minha data de término é anterior à data de início.
Observe que para testar essa restrição, tive que aumentar o preço para um valor válido para evitar que a restrição anterior fosse acionada primeiro (
CHECK
restrições são validadas na ordem em que são criadas). Exemplo 4 – Inserção bem-sucedida de dados em conformidade com a restrição
Para inserir uma linha com sucesso, tudo o que precisamos fazer é ter certeza de que estamos inserindo valores válidos.
Exemplo:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Resultado:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Observe que o EventId A coluna já foi incrementada para 4. Isso ocorre porque é uma
IDENTITY
coluna. Uma coisa importante a ser lembrada sobre IDENTITY
colunas é que elas aumentam mesmo quando uma restrição causa um INSERT
operação falhar. Algumas restrições das restrições CHECK
Aqui estão algumas restrições a serem observadas ao trabalhar com
CHECK
restrições:- A condição de pesquisa deve ser avaliada como uma expressão booleana e não pode fazer referência a outra tabela.
- A expressão não pode conter tipos de dados de alias.
CHECK
restrições não podem ser definidas em texto , ntext , ou imagem colunas.