Beschränken Sie die Eingabe auf einige verschiedene Zeichenfolgen

11

Hallo, ich kann nicht scheinen, dass eine Einschränkung so funktioniert, wie ich es in postgreSQL erwarte. Innerhalb von pgadmin führe ich die folgende SQL-Abfrage aus.

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

Bei der Ausführung wird dies in konvertiert.

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

Ich erwarte, dass dies meine Eingabe für die Spalte "Typen" auf eine der E-Mail-Post-IRL oder Minuten beschränkt. Bei der Eingabe von Tabellendaten schlägt diese Einschränkung jedoch fehl, wenn ich einen dieser Typen eingebe. Die Spalte Typen ist vom Typ Zeichen. Weiß jemand, wie man das behebt? Vielen Dank.

wookie1
quelle
3
Gibt es einen Grund, warum es nicht viel einfacher wäre, etwas zu lesen, wenn ich etwas nicht verstehe CHECK (type in ('email','post','IRL','minutes')?
Rfusca

Antworten:

15

Ändern Sie Ihre Einschränkung in

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

Dies wird vom Parser konvertiert in:

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

Das sollte tun, was Sie suchen.

Ich muss mich jedoch fragen, ob es nicht besser wäre, dies zu tun:

CREATE TABLE comlog_types (
     type text
);

Fügen Sie dann einen Fremdschlüssel hinzu, um die Einschränkung zu erzwingen. Dies würde es in Zukunft einfacher machen, Typen hinzuzufügen.

Chris Travers
quelle
Danke, das hat es perfekt gelöst. Ich könnte in Zukunft versuchen, auf die Fremdschlüsselmethode umzusteigen.
Wookie1
2
Ja, es funktioniert gut. Möglicherweise möchten Sie aber auch den Enum-Datentyp von PostgreSQL überprüfen .
XåpplI'-I0llwlg'I -