Ограничить ввод для нескольких разных строк


11

Привет я не могу получить ограничение работает так, как я ожидаю в PostgreSQL. Изнутри pgadmin я выполняю следующий SQL-запрос.

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes');
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

При выполнении это преобразуется в.

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" ~ similar_escape('email|post|IRL|minutes'::text, NULL::text));
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

Я ожидаю, что это ограничит мой ввод для столбца Types одним из IRL сообщения электронной почты или минут. Однако при вводе данных таблицы это ограничение не выполняется, когда я ввожу один из этих типов. Столбец Типы имеет тип символа. Кто-нибудь знает, как это исправить. Спасибо.


3
Если я чего-то не понимаю, есть ли причина, по которой читать было бы намного легче CHECK (type in ('email','post','IRL','minutes')?
rfusca

Ответы:


15

Измените ваше ограничение на

CHECK (type IN ('email','post','IRL','minutes'))

Это будет преобразовано парсером в:

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))

Это должно делать то, что вы смотрите.

Однако мне интересно, не лучше ли это сделать:

CREATE TABLE comlog_types (
     type text
);

А затем добавьте внешний ключ, чтобы применить ограничение. Это облегчит добавление типов в будущем.


Спасибо, это решено отлично. Я мог бы посмотреть на переход на метод внешнего ключа в будущем.
wookie1

2
Да, это работает хорошо. Но вы также можете проверить тип данных перечисления PostgreSQL .
XåpplI'-I0llwlg'I -
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.