Запретить пустые строки в поле CHARACTER VARYING - PullRequest
16 голосов
/ 04 марта 2012

Я использую 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 ]

22 голосов
/ 04 марта 2012

Использовать проверочное ограничение :

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

INSERT INTO foobar(x) VALUES('');
5 голосов
/ 04 марта 2012

Вы можете использовать стандартное предложение SQL 'CONSTRAINT ... CHECK' при определении полей таблицы:

CREATE TABLE test
(
    nonempty VARCHAR NOT NULL UNIQUE CONSTRAINT non_empty CHECK(length(nonempty)>0)
)
3 голосов
/ 04 марта 2012

В качестве особого вида ограничения вы можете поместить ограничение datatype + в 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' );

Это позволит вам снова и снова использовать домен без необходимости каждый раз копировать ограничение.

...