Ogranicz wprowadzanie do kilku różnych ciągów


12

Cześć Nie mogę uzyskać ograniczenia działającego tak, jak się spodziewam w postgreSQL. Z poziomu pgadmin wykonuję następujące zapytanie 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';

Po wykonaniu jest to konwertowane na.

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

Oczekuję, że ograniczy to mój wkład do kolumny Typy do jednego z IRL postu e-mail lub minut. Jednak podczas wprowadzania danych tabeli to ograniczenie nie działa, gdy wprowadzam jeden z tych typów. Kolumna Typy ma charakter znakowy. Czy ktoś wie, jak to naprawić. Dzięki.


3
Chyba że czegoś nie rozumiem, czy istnieje powód, dla którego nie byłoby łatwiej go czytać CHECK (type in ('email','post','IRL','minutes')?
rfusca

Odpowiedzi:


16

Zmień swoje ograniczenie na

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

Zostanie to przekonwertowane przez parser na:

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

To powinno zrobić to, na co patrzysz.

Jednak muszę się zastanawiać, czy nie byłoby lepiej to zrobić:

CREATE TABLE comlog_types (
     type text
);

A następnie dodaj klucz obcy, aby wymusić ograniczenie. Ułatwi to dodawanie typów w przyszłości.


Dzięki, rozwiązało to doskonale. W przyszłości mogę rozważyć zmianę na metodę klucza obcego.
wookie1

2
Tak, działa dobrze. Ale możesz także sprawdzić typ danych wyliczeniowych PostgreSQL .
XåpplI'-I0llwlg'I -
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.