Uma restrição CHECK
permite especificar que os valores de uma ou mais colunas têm de satisfazer uma expressão booleana. Nesta página, descrevemos como adicionar e gerir este tipo de restrição em bases de dados com dialeto GoogleSQL e bases de dados com dialeto PostgreSQL.
Adicione uma restrição de verificação a uma nova tabela
No seguinte fragmento do CREATE TABLE
, criamos uma tabela para armazenar informações
sobre concertos.
Para exigir que a hora de fim de um concerto seja posterior à hora 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
. Nomeámos explicitamente a restrição start_before_end
neste exemplo para ajudar a encontrá-la nas mensagens de erro e sempre que precisarmos de fazer referência à mesma. Se não for indicado nenhum nome, o Spanner fornece um, com o nome gerado a começar pelo prefixo CK_
. Os nomes das restrições estão ao nível do esquema, juntamente com os nomes das tabelas e dos índices, e têm de ser exclusivos no esquema. A definição da restrição CHECK consiste na palavra-chave CHECK
seguida de uma expressão entre parênteses. A expressão só pode referenciar colunas desta tabela. Neste exemplo, faz referência a StartTime e EndTime, e a restrição de verificação garante que a hora de início de um concerto é sempre inferior à hora de fim.
O valor da expressão de restrição de verificação é avaliado quando é inserida uma nova linha ou quando os campos StartTime
ou EndTime
de uma linha existente são atualizados. Se a expressão for avaliada como TRUE
ou NULL
, a alteração de dados é permitida pela restrição de verificação. Se a expressão for avaliada como FALSE
, a alteração de dados não é permitida.
Aplicam-se as seguintes restrições a um termo de restrição de verificação
expression
.A expressão só pode referenciar colunas na mesma tabela.
A expressão tem de fazer referência a, pelo menos, uma coluna não gerada, seja diretamente ou através de uma coluna gerada que faça referência a uma coluna não gerada.
A expressão não pode fazer referência a colunas que tenham definido a opção
allow_commit_timestamp
.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()
.
Adicione uma restrição de verificação a uma tabela existente
Usando a seguinte declaração ALTER TABLE
, adicionamos uma restrição para garantir que todos os IDs de concertos são superiores a zero.
ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);
Mais uma vez, atribuímos um nome à restrição, concert_id_gt_0. A adição de 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 estão em conformidade com a nova restrição. Uma vez que esta validação é realizada como uma operação de longa duração, as transações em curso na tabela não são afetadas. Para mais informações, consulte o artigo Desempenho da atualização do esquema. Se existirem violações nos dados existentes, a restrição é revertida.
Remova uma restrição de verificação
A declaração DDL seguinte elimina uma restrição CHECK
da tabela Concerts
.
ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;
Modifique uma expressão de restrição de verificação
Não é permitido modificar a expressão de uma restrição CHECK
. Em alternativa, tem de remover a restrição existente e criar uma nova restrição com a nova expressão.
Veja 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 na sua base de dados. Seguem-se alguns exemplos das perguntas às quais pode responder consultando o esquema de informações.
Que restrições de verificação estão definidas na minha base 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 na minha base de dados?
Se adicionou uma restrição de verificação a uma tabela existente, pode querer
ver o respetivo estado atual para determinar, por exemplo, se todos os dados existentes foram
validados em relação à restrição. Se SPANNER_STATE
devolver VALIDATING_DATA
na seguinte consulta, significa que o Spanner ainda está a validar os dados existentes em função dessa restrição.
SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;
O que se segue?
- Saiba mais acerca do INFORMATION SCHEMA do Spanner.