2010-04-10 12 views
23

Tengo una tabla definida por el siguiente SQL:restricción de comprobación de SQLite condicional?

CREATE TABLE test (
    id  integer PRIMARY KEY NOT NULL UNIQUE, 
    status text NOT NULL, 
    enddate date, 
    /* Checks */ 
    CHECK (status IN ("Current", "Complete")) 
); 

Me gustaría añadir una restricción que requiere enddate ser no nulo si la status es "completa".

¿Esto es posible? Estoy usando SQLite v3.6.16.

Respuesta

35

¿Qué tal:

CHECK (status = "Current" or (status = "Complete" and enddate is not null)) 
+2

Gracias, esto funciona. ¿Es esta la única manera? En el futuro, puedo tener una mayor cantidad de estados y el cheque podría crecer bastante. – Rezzie

+4

Cuando las restricciones se vuelven muy complejas, el enfoque generalmente es colocar una capa en frente de la tabla para aplicarla. Al igual que una capa de procedimiento almacenado o una biblioteca de acceso a datos. – Andomar

+0

Gracias por el consejo. – Rezzie

5
CREATE TABLE test (
    id  integer PRIMARY KEY, 
    status text NOT NULL CHECK (status IN ('Current', 'Complete')), 
    enddate date NOT NULL 
); 

Esto funcionará en SQLite, con la línea escrita CHECK restricción. Cambié las comillas dobles a apóstrofes para que pueda usarse en PHP.

+0

¿Has leído la pregunta? Incluso puso la parte importante en ** negrita ** lo que acaba de descartar. – TWiStErRob

0

No hay nada que le impida tener múltiples restricciones CHECK en una sola tabla. OMI la solución más simple y fácilmente ampliable:

CHECK (status IN ("Current", "Complete")) 
CHECK (status <> "Complete" OR enddate IS NOT NULL) 

Esto utiliza el hecho de que si A entonces B es lógicamente equivalente a ya sea A o B no.

Cuestiones relacionadas