Contraindre l'entrée à quelques chaînes différentes


11

Salut, je n'arrive pas à obtenir une contrainte fonctionnant comme je m'y attend dans postgreSQL. Depuis 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';

Une fois exécuté, il 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'un des messages électroniques IRL ou minutes. Cependant, lors de la saisie de données de table, cette contrainte échoue lorsque j'entre l'un de ces types. La colonne Types est de type caractère. Est-ce que quelqu'un sait comment réparer ceci. Merci.


3
À moins que je ne comprenne pas quelque chose, y a-t-il une raison pour laquelle ce ne serait pas beaucoup plus facile à lire CHECK (type in ('email','post','IRL','minutes')?
rfusca

Réponses:


15

Changez votre contrainte en

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 dois me demander s'il ne serait pas préférable de le faire:

CREATE TABLE comlog_types (
     type text
);

Et puis ajoutez une clé étrangère pour appliquer la contrainte. Cela faciliterait l'ajout de types à l'avenir.


Merci, c'est résolu parfaitement. Je pourrais envisager de passer à la méthode de la clé étrangère à l'avenir.
wookie1

2
Ouais, ça marche bien. Mais vous pouvez également vérifier le type de données enum de PostgreSQL .
XåpplI'-I0llwlg'I -
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.