Vés al contingut

Check constraint

De la Viquipèdia, l'enciclopèdia lliure
Aquesta és una versió anterior d'aquesta pàgina, de data 13:18, 26 jul 2015 amb l'última edició de KRLS (discussió | contribucions). Pot tenir inexactituds o contingut no apropiat no present en la versió actual.

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:

 PREU >= 0
 QUANTITAT >= 0

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 ),
    ...
 )

NO constrenyiment de NULL

Un NO constrenyiment de NULL és funcionalment equivalent al constrenyiment de control següent amb un NO ÉS predicat de NULL:

Alguns sistemes d'administració de base de dades relacionals són capaços d'optimitzar actuació quan el NO sintaxi de constrenyiment del NULL és utilitzada mentre oposat a la sintaxi de constrenyiment del CONTROL donada damunt.[1]

Restriccions comunes

La majoria de sistemes d'administració de la base de dades restringeixen constrenyiments de control a una fila sola, amb accedir a constants i funcions deterministes, però no a dada en altres taules, o a la dada invisible a la transacció actual a causa d'aïllament de transacció.

Tals constrenyiments no són veritablement constrenyiments de control de la taula sinó constrenyiments de control de la fila. Perquè aquests constrenyiments són generalment només verificat quan una fila és directament actualitzat (per raons d'actuació,) i sovint implementat mentre implicat INSEREIX o gallets d'ACTUALITZACIÓ, constrenyiments d'integritat podrien ser violated per l'acció indirecta el va ser no per aquestes limitacions. A més, modificacions altrament vàlides a aquests rècords llavors serien impedits pel constrenyiment de CONTROL. Alguns exemples de constrenyiments perillosos inclouen:

Usuari-va definir els gallets poden soler feina al voltant d'aquestes restriccions. Tot i que similar dins implementació, és semantically neteja que els gallets només seran acomiadats quan la taula és directament modificat, i que és el dissenyador responsabilitat de manejar canvis indirectes, importants en altres taules; els constrenyiments d'altra banda són pretesos per ser "cert en tot moment" malgrat tot de les accions de l'usuari o la manca del dissenyador de foresight.

References

  1. PostgreSQL 8.3devel Documentation, Chapter 5.