Обмежте введення декількома різними рядками


12

Привіт, я не можу отримати обмеження, працюючи так, як я очікую в 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';

Я очікую, що це обмежить моє введення для стовпця "Типи" однією з повідомлень електронної пошти IRL або хвилин. Однак при введенні даних таблиці це обмеження не вдається, коли я ввожу один із цих типів. Стовпець "Типи" має характер символів. Хтось знає, як це виправити. Дякую.


3
Якщо я щось не розумію, чи є причина, яку читати не було б набагато простіше CHECK (type in ('email','post','IRL','minutes')?
rfusca

Відповіді:


16

Змініть обмеження на

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.