2017-10-11 17 views
1

この質問は緩くHow can I create a constraint to check if an email is valid in postgres?タイプでPostgresqlの正規表現ではなく、チェック制約

をオフに基づいている私は、文字列型を使用し、チェック制約を経由して、それを制約することができます知っている:)

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

を。構文は次のようになりますように

しかし、私は、カスタムタイプを作成できるようにしたいのですが、次の

create table emails (
    email email_address 
); 
私は CREATE TYPEがここで使用のだろうと思っているだろう

が、これではありませんので、コンポジット、範囲、列挙型など、私はそれにどのようにアプローチするのか分かりません。

これは、同じチェック制約を持つ複数のテーブルがあるためです。私は、すべてのテーブルを1つずつ調べるのではなく、1つの場所(おそらくタイプを介して)で制約を微調整したいと思います。私はテーブル定義をより良く見えるようにすることもできると思います(電子メールではありませんが、 "email_address"タイプで解決された場合は直接適用可能です)。

documentationには、入出力機能を使用して文字列を特定のタイプにオートボックスすることができます。おそらく、私が無効なcstringを受け取ったときに例外を発生させたとしても、それはそのように動作するかもしれませんが、結局のところ、文字列にしたいと思っていることを考えると、ほんの少しの構文的な砂糖/重複除外。

答えて

1

使用して、domain.

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

例:

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

私が望んでいる可能性と同じくらい完璧な答えです。ありがとう! –

関連する問題