Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Aggiungere un vincolo CHECK a una tabella esistente in SQL Server (T-SQL)

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.