Creare e gestire i vincoli di controllo

Un vincolo CHECK ti consente di specificare che i valori di una o più colonne devono soddisfare un'espressione booleana. In questa pagina viene descritto come aggiungere e gestire questo tipo di vincolo nei database in dialetto GoogleSQL e nei database in dialetto PostgreSQL.

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, includiamo 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 per aiutarti a trovarlo nei messaggi di errore e ogni volta che dobbiamo farvi riferimento. Se non viene fornito alcun nome, 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 definizione del vincolo di controllo è costituita dalla parola chiave CHECK seguita da un'espressione tra parentesi. L'espressione può fare riferimento solo alle colonne di questa tabella. In questo esempio, fa riferimento a StartTime e EndTime e il vincolo di controllo assicura che l'ora di inizio di un concerto sia sempre inferiore all'ora di fine.

Il valore dell'espressione della condizione di controllo viene valutato quando viene inserita una nuova riga o quando vengono aggiornati i valori StartTime o EndTime di una riga esistente. Se la valutazione dell'espressione è TRUE o NULL, la modifica dei dati è consentita dal vincolo di controllo. Se l'espressione ha valore FALSE, la modifica dei dati non è consentita.

  • Al termine expression di un vincolo 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, direttamente o tramite una colonna generata che fa riferimento a una colonna non generata.

    • 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() e CURRENT_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);

Anche in questo caso abbiamo assegnato un nome al vincolo, concert_id_gt_0. L'aggiunta di un vincolo CHECK a una tabella esistente avvia immediatamente l'applicazione del vincolo per i nuovi dati e un'operazione a lunga esecuzione per convalidare la conformità dei dati esistenti al nuovo vincolo. Poiché questa convalida viene eseguita come operazione a lunga esecuzione, le transazioni in corso nella tabella non sono interessate. Per ulteriori informazioni, consulta Rendimento dell'aggiornamento dello schema. Se esistono violazioni dei dati esistenti, il vincolo viene annullato.

Rimuovere 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. Devi invece eliminare la limitazione esistente e crearne una nuova con la nuova expression.

Visualizzare le proprietà di una clausola di controllo

INFORMATION_SCHEMA di Spanner contiene informazioni sui vincoli di controllo nel database. Di seguito sono riportati alcuni esempi di domande a cui puoi rispondere eseguendo query sullo schema delle 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 delle limitazioni di controllo 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 seguente query, significa che 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