2012-03-04 20 views
8

Estoy usando PostgreSQL y me gustaría evitar que ciertos campos VARIACIONES DE CARACTERES (VARCHAR) necesarios permitan entradas de cadenas vacías.Evitar cadenas vacías en el campo VARIACIÓN DE CARACTERES

Estos campos también deberían contener valores únicos, por lo que ya estoy usando una restricción única; sin embargo, esto no evita un valor vacío original (único).

Ejemplo básico, donde nombre de usuario debe ser único y no está vacío

| id | username | password | 
+----+----------+----------+ 
| 1 | User1 | pw1  | #Allowed 
| 2 | User2 | pw1  | #Allowed 
| 3 | User2 | pw2  | #Already prevented by constraint 
| 4 | ''  | pw2  | #Currently allowed, but needs to be prevented 

Respuesta

14

Use un check constraint:

CREATE TABLE foobar(
    x TEXT NOT NULL UNIQUE, 
    CHECK (x <> '') 
); 

INSERT INTO foobar(x) VALUES(''); 
5

Usted puede utilizar el estándar SQL 'CONSTREÑIMIENTO ... VER' cláusula al definir campos de la tabla:

CREATE TABLE test 
(
    nonempty VARCHAR NOT NULL UNIQUE CONSTRAINT non_empty CHECK(length(nonempty)>0) 
) 
2

Como un tipo especial de restricción, se puede poner el tipo de datos + constr aint en un dominio:

-- set search_path='tmp'; 

DROP DOMAIN birthdate CASCADE; 
CREATE DOMAIN birthdate AS date DEFAULT NULL 
    CHECK (value >= '1900-01-01' AND value <= now()) 
    ; 

DROP DOMAIN username CASCADE; 
CREATE DOMAIN username AS VARCHAR NOT NULL 
    CHECK (length(value) > 0) 
    ; 

DROP TABLE employee CASCADE; 
CREATE TABLE employee 
    (empno INTEGER NOT NULL PRIMARY KEY 
    , dob birthdate 
    , zname username 
    , UNIQUE (zname) 
    ); 
INSERT INTO employee(empno,dob,zname) 
    VALUES (1,'1980-02-02', 'John Doe'), (2,'1980-02-02', 'Jon Doeh'); 
INSERT INTO employee(empno,dob,zname) 
    VALUES (3,'1980-02-02', ''), (4,'1980-01-01', 'Joan Doh'); 

Esto le permitirá volver a utilizar el dominio y otra vez, sin tener que copiar la restricción cada vez.

+0

https://en.wikipedia.org/wiki/Jeralean_Talley – OdraEncoded

Cuestiones relacionadas