Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Adicionar uma restrição CHECK a uma tabela existente no SQL Server (T-SQL)


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.