SQL не пустой вместо Not NULL

#sql #postgresql #notnull

#sql #postgresql #notnull

Вопрос:

Я использую PostgreSQL. У меня есть столбец, который:

 NOT NULL
  

Однако, когда я хочу вставить строку с пустой строкой, например:

 ''
  

он не выдает мне ошибку и принимает. Как я могу проверить, должно ли значение вставки быть not empty ? (Ни пустой, ни нулевой)

PS: мой столбец определен как:

 "ads" character varying(60) NOT NULL
  

Ответ №1:

Добавьте ограничение к определению столбца. Например, что-то вроде:

 ads character varying(60) NOT NULL CHECK (ads <> '')
  

Подробнее см. http://www.postgresql.org/docs/current/static/ddl-constraints.html

Комментарии:

1. Почему вы ссылаетесь на старую версию 8.3? Смотрите здесь для получения дополнительной информации: meta.stackexchange.com/questions/108714 /…

2. Вы также можете добавить домен, если используете это чаще: postgresql.org/docs/current/static/sql-createdomain.html

Ответ №2:

Найденный в текущей документации PostgreSQL, вы можете сделать следующее, чтобы достичь желаемого:

 CREATE TABLE distributors (
    did    integer PRIMARY KEY DEFAULT nextval('serial'),
    name   varchar(40) NOT NULL CHECK (name <> '')
);
  

Из документации:

CHECK ( expression )

Предложение CHECK указывает выражение, выдающее логический результат, которому должны удовлетворять новые или обновленные строки для успешной операции вставки или обновления. Выражения, оценивающие значение TRUE или UNKNOWN, завершаются успешно. Если какая-либо строка операции вставки или обновления выдает ЛОЖНЫЙ результат, возникает исключение ошибки, и вставка или обновление не изменяют базу данных. Ограничение проверки, указанное в качестве ограничения столбца, должно ссылаться только на значение этого столбца, в то время как выражение, появляющееся в ограничении таблицы, может ссылаться на несколько столбцов.

В настоящее время выражения ПРОВЕРКИ не могут содержать подзапросы или ссылаться на переменные, отличные от столбцов текущей строки.

Комментарии:

1. PostgreSQL 8.2? Версия 8.2 была выпущена в 2006 году (!), Срок ее службы истекает в этом году . Пожалуйста, обратитесь /current , если вам не нужно обращаться к старой версии. Больше информации здесь: meta.stackexchange.com/questions/108714 /…