# Check constraint

Una check constraint és un tipus de restricció d'integrat en SQL que especifica un requisit que ha de ser complert per cada fila d'una taula de la base de dades. La restricció ha de ser un predicat i es pot referir a una o múltiples columnes de la taula. El resultat del predicat pot ser qualsevol TRUE, FALSE, o UNKNOWN, segons la presència de NULLs. Si el predicat avalua UNKNOWN, llavors la restricció no és violada i la fila pot ser inserida o actualitzada a la taula. Aquest comportament és contrari als predicats a les clàusules WHERE dins una sentència SELECT o UPDATE.
Per exemple, en una taula que conté productes, hom podria afegir una check constraint tal que el preu d'un producte i la quantitat d'un producte no pot tenir un valor negatiu:
Si aquesta registració no hi fos, seria possible tenir l'atribut PREU i QUANTITAT amb un valor negatiu, -30. (-30$ o -30 elements respectivament)
Les check constraints s'usen per assegurar-se la validesa de les dades en una base de dades i proporcionar-li una integritat de dades. En el cas d'utilitzar-se a nivell de base de dades, les aplicacions que utilitzen la base de dades no podran afegir cap dada invàlida o modificar una dada vàlida que esdevingui invàlida, encara que a nivell d'aplicació permeti introduir dades invàlides.

## Definició

Les check constraint només poden ser definides a través d'una sentència CREATE TABLE o ALTER TABLE fent ús de la següent sintaxi:
CREATE TABLE nom_taula ( ..., CONSTRAINT nom_constraint CHECK (predicat), ... )
ALTER TABLE nom_taula ADD CONSTRAINT nom_constraint CHECK (predicat)
Es pot definir una restricció que només controli les dades d'una columna amb la sentència següent:
CREATE TABLE nom_taula ( ... nom_columna tipus CHECK (predicat), ... )

## Restriccions NOT NULL

Una restricció NOT NULL és funcionalment equivalent a una check constraint amb predicat IS NOT NULL:
CHECK (nom_columna IS NOT NULL)
Certs sistema de gestió de bases de dades relacionals són capaços d'optimitzar el rendiment quan la sintaxi de la restricció NOT NULL s'utilitza en lloc de la sintaxi de la restricció CHECK donada anteriorment.

## Restriccions comunes

La majoria de SGBDs restringeixen les check constraints a una única fila, amb accés a constants i funcions deterministes, però no a dades d'altres taules, o dades invisibles per a la transacció actual, donat que existeix un aïllament de la transacció.
Les constraints no són veritablement check constraints de taula sinó més aviat check constraints de fila. Les restriccions d'integritat podrien ser violades per l'acció indirecta si no fos per la limitació que aquestes restriccions generalment es verifiquen només quan una fila és modificada directament (per raons de rendiment) i sovint s'implementen com a disparadors INSERT o UPDATE. A més a més, modificacions altrament vàlides en aquests registres llavors serien impedides per la restricció CHECK Alguns exemples de restriccions perilloses poden ser:
* CHECK ((select count(*) from factura where factura.IdComprador = idComprador) < 1000)
* CHECK (dataInsercio = CURRENT_DATE)
* CHECK (countItems = RAND)
Els disparadors definits per l'usuari es poden utilitzar per evitar aquestes restriccions. Encara que tenen una implementació similar, és clar que els disparador semànticament només es disparen quan la taula és modificada directament, i és responsabilitat del dissenyador gestionar les indirectes, canvis importants en altres taules; per altra banda es pretén que les constraints siguin "certes en tot moment", independentment de les accions de l'usuari o de la manca de previsió del dissenyador.

## Referències

* ↑ PostgreSQL 8.3devel Documentation, Chapter 5.