Uma restrição CHECK
permite que você especifique se os valores de uma ou mais colunas precisam
satisfazer uma expressão booleana. Nesta página, descrevemos como adicionar e
gerenciar esse tipo de restrição em bancos de dados com dialeto GoogleSQL e PostgreSQL.
Adicionar uma restrição de verificação a uma nova tabela
No snippet CREATE TABLE
a seguir, criamos uma tabela para armazenar informações
sobre shows.
Para exigir que o horário de término de um show seja posterior ao horário de início, incluímos
uma restrição de verificação.
GoogleSQL
CREATE TABLE Concerts (
ConcertId INT64,
StartTime Timestamp,
EndTime Timestamp,
CONSTRAINT start_before_end CHECK(StartTime < EndTime),
) PRIMARY KEY (ConcertId);
PostgreSQL
CREATE TABLE Concerts (
ConcertId BIGINT,
StartTime TIMESTAMPTZ,
EndTime TIMESTAMPTZ,
CONSTRAINT start_before_end CHECK(StartTime < EndTime),
PRIMARY KEY (ConcertId)
);
A definição da restrição começa com a palavra-chave CONSTRAINT
. Chamamos explicitamente
a restrição start_before_end
neste exemplo para ajudar você a encontrá-la em
mensagens de erro e sempre que precisarmos consultar. Se nenhum nome for fornecido,
o Spanner vai fornecer um, com o nome gerado que começa com
o prefixo CK_
. Os nomes das restrições têm como escopo o esquema, além dos nomes das tabelas e índices, por exemplo. Eles precisam ser exclusivos
dentro do esquema. A definição da restrição de
verificação consiste na palavra-chave CHECK
seguida de uma expressão
entre parênteses. A expressão só pode referenciar colunas desta tabela. Neste
exemplo, ele se refere a StartTime e EndTime. A restrição de verificação
garante que o horário de início de um show seja sempre menor que o horário de término.
O valor da expressão de restrição de verificação é avaliado quando uma nova linha é
inserida ou quando o StartTime
ou o EndTime
de uma linha existente são atualizados. Se
a expressão for avaliada como TRUE
ou NULL
, a alteração de dados será permitida pela
restrição de verificação. Se a expressão for avaliada como FALSE
, a alteração dos dados não será
permitida.
As restrições a seguir se aplicam a um termo
expression
de restrição de verificação.A expressão só pode referenciar colunas na mesma tabela.
A expressão precisa referenciar pelo menos uma coluna não gerada diretamente ou meio de uma coluna gerada que se refere a uma coluna não gerada.
A expressão não pode referenciar colunas que tenham a opção
allow_commit_timestamp
definida.A expressão não pode conter subconsultas.
A expressão não pode conter funções não determinísticas, como
CURRENT_DATE()
eCURRENT_TIMESTAMP()
.
Adicionar uma restrição de verificação a uma tabela
Usando a instrução ALTER TABLE
a seguir, adicionamos uma restrição para garantir
que todos os IDs de shows sejam maiores que zero.
ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);
Mais uma vez, fornecemos um nome à restrição, concert_id_gt_0. Adicionar uma
restrição CHECK
a uma tabela existente inicia a aplicação da restrição
imediatamente para novos dados e inicia uma operação de longa duração para validar se
os dados existentes obedecem à nova restrição. Como essa validação é
executada como uma operação de longa duração, as transações em andamento na tabela não
são afetadas. Para mais informações, consulte Desempenho da atualização do esquema. Se houver
alguma violação nos dados existentes, a restrição será revertida.
Remover uma restrição de verificação
A instrução DDL a seguir descarta uma restrição CHECK
da tabela Concerts
.
ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;
Modificar uma expressão de restrição de verificação
Não é permitido modificar a expressão de uma restrição CHECK
. Em vez disso,
é necessário descartar a restrição atual e criar uma nova com a nova
expressão.
Conferir as propriedades de uma restrição de verificação
O INFORMATION_SCHEMA do Spanner contém informações sobre as restrições de verificação do seu banco de dados. Veja a seguir alguns exemplos das perguntas que é possível responder consultando o esquema de informações.
Quais restrições de verificação são definidas no meu banco de dados?
SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'CHECK';
Qual é o estado atual das restrições de verificação no meu banco de dados?
Se você adicionou uma restrição de verificação a uma tabela atual, convém
visualizar o estado atual dela para determinar, por exemplo, se todos os dados existentes foram
validados em relação à restrição. Se SPANNER_STATE
retornar
VALIDATING_DATA
na consulta a seguir, isso significa
que o Spanner ainda está em processo de validação de dados
em relação a essa restrição.
SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;
A seguir
- Saiba mais sobre o INFORMATION SCHEMA do Spanner.