2012-03-04 6 views
8

Sto usando PostgreSQL e vorrei evitare che determinati campi CHARACTER VARYING (VARCHAR) richiesti consentissero input di stringa vuoti.Impedire le stringhe vuote nel campo CHARACTER VARYING

Questi campi dovrebbero anche contenere valori univoci, quindi sto già utilizzando un vincolo univoco; tuttavia, ciò non impedisce un valore vuoto (unico) originale.

Esempio di base, in cui il nome utente deve essere unico e non vuota

| 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 

risposta

14

Usa un check constraint:

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

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

È possibile utilizzare lo standard SQL 'CONSTRAINT ... VEDI' clausola al momento di definire i campi della tabella:

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

Come un particolare tipo di vincolo, si può mettere il tipo di dati + constr aint in 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'); 

Questo vi permetterà di riutilizzare più e più volte il dominio, senza dover copiare il vincolo ogni volta.

+0

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