2017-10-11 48 views
1

PostgreSQL的正則表達式這個問題是基於鬆散關閉How can I create a constraint to check if an email is valid in postgres?型,而不是檢查約束

我知道我可以使用一個字符串類型,並通過檢查約束限制它:

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會使用在這裏,但因爲這不是一個複合,範圍和枚舉類型,我不知道如何處理它。

爲了記錄,這是因爲我有多個表都具有相同的檢查約束。我想在一個地方調整約束(通過一個類型),而不是一個一個地遍歷所有的表格。我認爲它也可以使表格定義看起來好很多(這不是用於電子郵件,但它是直接適用的,如果它解決了「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

這是對完美的,因爲我可以期待一個答案。謝謝! –