2012-03-04 17 views
8

我正在使用PostgreSQL並希望阻止某些必需的CHARACTER VARYING(VARCHAR)字段允許空字符串輸入。阻止CHARACTER VARYING字段中的空字符串

這些字段也需要包含唯一值,所以我已經使用了一個唯一的約束;但是,這並不妨礙原始(唯一)空值。

基本例如,在用戶名必須是唯一的,而不是空

| 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 

回答

14

使用a check constraint

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

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

您可以使用標準的SQL「約束...檢查」定義表中的字段時子句:

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

作爲一種特殊的約束,可以將數據類型+構造函數是不是到域:

-- 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'); 

這將讓你一次又一次地重複使用域,而無需每次都複製約束。

+0

https://en.wikipedia.org/wiki/Jeralean_Talley – OdraEncoded 2015-06-14 12:39:55