Questo articolo mostra come aggiungere un CHECK
vincolo a una tabella esistente.
Puoi aggiungere un vincolo a una tabella esistente utilizzando ALTER TABLE
istruzione insieme a ADD CONSTRAINT
discussione. Esempi sotto.
Esempio 1:creare la tabella
Per prima cosa, creiamo una tabella per la quale aggiungeremo il CHECK
vincolo.
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 );
Esempio 2:aggiunta di un vincolo a livello di colonna
Ora aggiungiamo un CHECK
vincolo al
Prezzo
colonna.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Questo vincolo garantirà che il prezzo sia sempre maggiore di zero.
Ora che il vincolo è stato aggiunto, ecco cosa succede se proviamo a inserire dati non validi:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Risultato:
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'.
In questo caso, il CHECK
vincolo specifica che tutti i dati nel Price
la colonna deve essere maggiore di 0. In altre parole, il prezzo non può essere zero e non può essere negativo.
Questo è indicato come un vincolo a livello di colonna , perché è definito su un'unica colonna. Si applica ai dati in una colonna.
Esempio 3:aggiungere un vincolo a livello di tabella
Ora aggiungiamo un CHECK
a livello di tabella vincolo. Questo controllerà i dati in due colonne.
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
In questo caso aggiungo un vincolo per garantire che la data di fine non possa mai essere anteriore alla data di inizio. Questo sta controllando i dati su due colonne ed è quindi un vincolo a livello di tabella.
Prova a inserire un valore non valido:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Risultato:
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".
Come previsto, l'operazione non riesce, perché la mia data di fine è precedente alla data di inizio.
Nota che per testare questo vincolo, ho dovuto aumentare il prezzo a un valore valido per evitare che il vincolo precedente fosse attivato per primo (CHECK
i vincoli vengono convalidati nell'ordine in cui sono stati creati).
Esempio 4 – Inserimento riuscito di dati conformi al vincolo
Per inserire correttamente una riga, tutto ciò che dobbiamo fare è assicurarci di inserire valori validi.
Esempio:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Risultato:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Tieni presente che
EventId
la colonna è già aumentata a 4. Questo perché è un IDENTITY
colonna. Una cosa importante da ricordare su IDENTITY
colonne è che si incrementano anche quando un vincolo provoca un INSERT
operazione fallita.
Alcune restrizioni dei vincoli CHECK
Ecco alcune restrizioni a cui prestare attenzione quando si lavora con CHECK
vincoli:
- La condizione di ricerca deve restituire un'espressione booleana e non può fare riferimento a un'altra tabella.
- L'espressione non può contenere tipi di dati alias.
CHECK
i vincoli non possono essere definiti su testo , ntesto o immagine colonne.