web-dev-qa-db-fra.com

Contraindre l'entrée à quelques cordes différentes

Salut, je ne peux pas sembler avoir une contrainte qui travaille comme je m'attends à PostgreSQL. À partir de PGADMIN, j'exécute la requête SQL suivante.

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

Lorsqu'il est exécuté, cela est converti en.

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

Je m'attends à ce que cela limite mon entrée pour la colonne Types à l'une des courriers électroniques Post IRL ou des minutes. Cependant, lors de la saisie de données de table Cette contrainte échoue lorsque je saisi l'un de ces types. La colonne Types est de type de caractère. Est-ce que quelqu'un sait comment réparer ceci. Merci.

11
wookie1

Changer votre contrainte pour

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

Ceci sera converti par l'analyseur en:

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

Cela devrait faire ce que vous regardez.

Cependant, je me demande si ce ne serait pas préférable de faire cela:

CREATE TABLE comlog_types (
     type text
);

Puis ajouter une clé étrangère pour faire respecter la contrainte. Cela faciliterait l'ajout de types à l'avenir.

15
Chris Travers