在CHARACTER VARYING字段中防止空字符串

时间:2012-03-04 15:23:32

标签: postgresql constraints varchar

我正在使用PostgreSQL,并希望阻止某些必需的CHARACTER VARYING(VARCHAR)字段允许空字符串输入。

这些字段还需要包含唯一值,因此我已经使用了一个唯一约束;但是,这不会阻止原始(唯一)空值。

基本示例,其中用户名必须是唯一的而不是空的

| 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

3 个答案:

答案 0 :(得分:21)

使用check constraint

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

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

答案 1 :(得分:5)

定义表字段时,可以使用标准SQL'CONSTRAINT ... CHECK'子句:

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

答案 2 :(得分:3)

作为一种特殊的约束,您可以将数据类型+约束放入DOMAIN:

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

这将允许您反复重复使用域,而无需每次都复制约束。