Un vincolo CHECK
ti consente di specificare che i valori di una o più colonne devono soddisfare un'espressione booleana. In questo articolo, spiegheremo come gestire
un tipo di vincolo nel tuo database.
Aggiungere una condizione di controllo a una nuova tabella
Nel seguente snippet CREATE TABLE
, creiamo una tabella per memorizzare le informazioni sui concerti.
Per richiedere che l'ora di fine di un concerto sia successiva all'ora di inizio,
includi un vincolo di controllo.
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)
);
La definizione della limitazione inizia con la parola chiave CONSTRAINT
. In questo esempio abbiamo nominato esplicitamente il vincolo start_before_end
, il che lo rende facile da identificare nei messaggi di errore e ogni volta che dobbiamo farvi riferimento. In caso contrario
Spanner ne fornisce uno, con il nome generato che inizia
con il prefisso CK_
. I nomi delle limitazioni hanno come ambito lo schema, insieme ai nomi delle tabelle e degli indici, e devono essere univoci all'interno dello schema. La
La definizione del vincolo di verifica è composta dalla parola chiave CHECK
seguita da un'espressione
le parentesi. L'espressione può fare riferimento solo alle colonne di questa tabella. In questo
esempio, fa riferimento a StartTime e EndTime e il controllo qui garantisce
che l'ora di inizio di un concerto sia sempre inferiore all'ora di fine.
Il valore dell'espressione del vincolo di verifica viene valutato quando viene visualizzata una nuova riga
o quando vengono aggiornati i valori StartTime o EndTime di una riga esistente. Se
l'espressione restituisce TRUE
o NULL
, la modifica dei dati è consentita
Controlla il vincolo. Se l'espressione ha il valore FALSE
, la modifica dei dati non è consentita.
Al termine
expression
di una condizione di controllo si applicano le seguenti limitazioni.L'espressione può fare riferimento solo alle colonne della stessa tabella.
L'espressione deve fare riferimento ad almeno una colonna non generata, che si tratti di direttamente o tramite una colonna generata che fa riferimento a un colonna.
L'espressione non può fare riferimento alle colonne per le quali è stata impostata l'opzione
allow_commit_timestamp
.L'espressione non può contenere sottoquery.
L'espressione non può contenere funzioni non deterministiche, come
CURRENT_DATE()
eCURRENT_TIMESTAMP()
.
Aggiungere una condizione di controllo a una tabella esistente
Utilizzando la seguente dichiarazione ALTER TABLE
, aggiungiamo una limitazione per assicurarci
che tutti gli ID concerto siano maggiori di zero.
ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);
Ancora una volta, abbiamo assegnato al vincolo un nome: concert_id_gt_0. L'aggiunta di un
Il vincolo CHECK
a una tabella esistente avvia l'applicazione del vincolo
immediatamente per i nuovi dati e avvia un'operazione a lunga esecuzione per
i dati esistenti sono conformi al nuovo vincolo. Poiché questa convalida è
eseguita come operazione a lunga esecuzione, le transazioni in corso nella tabella
interessati. Per maggiori informazioni, consulta la sezione Prestazioni dell'aggiornamento dello schema. Se sono presenti violazioni nei dati esistenti, il vincolo viene annullato.
Rimuovi un vincolo di controllo
La seguente istruzione DDL elimina un vincolo CHECK
dalla tabella Concerts
.
ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;
Modificare un'espressione di vincolo di controllo
Non è consentita la modifica dell'espressione di un vincolo CHECK
. Invece,
rimuovere il vincolo esistente e crearne uno nuovo con
un'espressione di base.
Visualizza le proprietà di un vincolo di controllo
INFORMATION_SCHEMA di Spanner contiene informazioni sulle limitazioni di controllo nel database. Di seguito sono riportati alcuni esempi di domande a cui puoi rispondere eseguendo una query sullo schema di informazioni.
Quali vincoli di controllo sono definiti nel mio database?
SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'CHECK';
Qual è lo stato attuale dei vincoli di verifica nel mio database?
Se hai aggiunto una clausola di controllo a una tabella esistente, ti consigliamo di visualizzarne lo stato attuale per determinare, ad esempio, se tutti i dati esistenti sono stati convalidati in base alla clausola. Se SPANNER_STATE
restituisce
VALIDATING_DATA
nella query seguente, significa Spanner
è ancora in fase di convalida dei dati esistenti in base a questo vincolo.
SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;
Passaggi successivi
- Scopri di più sullo SCHEMA INFORMATION di Spanner.