2017-10-11 5 views
1

Cette question est vaguement basé hors How can I create a constraint to check if an email is valid in postgres?Postgresql expression régulière en caractères plutôt que contrainte de vérification

Je sais que je peux utiliser un type de chaîne et la contraindre par une contrainte de vérification:

CREATE TABLE emails (
    email varchar 
    CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+[.][A-Za-z]+$') 

);

Cependant, je voudrais être en mesure de créer un type personnalisé de sorte que la syntaxe serait la suivante

create table emails (
    email email_address 
); 

j'aurais pensé que CREATE TYPE serait utile ici, mais puisque ce n'est pas un composite, gamme ou enum type, je ne sais pas comment je l'aborderais. Pour l'anecdote, c'est parce que j'ai plusieurs tables avec la même contrainte de vérification. J'aimerais modifier la contrainte en un point (par un type peut-être) plutôt que de parcourir toutes les tables une par une. Je pense que cela pourrait aussi rendre les définitions des tables beaucoup plus belles (ce n'est pas pour les emails, mais c'est directement applicable si elles ont été résolues pour un type "email_address").

Le documentation indique que vous pouvez effectuer une autobox d'une chaîne à un certain type en utilisant une fonction d'entrée et de sortie. Peut-être que si je soulève une exception à la réception d'un cstring invalide, cela pourrait être fait pour fonctionner de cette façon, mais cela semble être un marteau, d'autant plus que je veux quand même que ce soit une corde après tout; juste un peu de sucre syntaxique/déduplication.

Répondre

1

Utilisez un domain.

create domain email_address as text 
    check (value ~* '^[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+[.][A-Za-z]+$') 

Exemples:

select 'abc'::email_address; 

ERROR: value for domain email_address violates check constraint "email_address_check" 

select '[email protected]'::email_address; 

email_address 
--------------- 
[email protected] 
(1 row) 
+0

C'est à peu près aussi parfait une réponse que je pouvais espérer. Merci! –