2016-08-02 57 views
4

我有一個名爲student表,與idname作爲字段:在<code>PostgreSQL</code>設置文本數組檢查約束在PostgreSQL

Create table student (id int, name text[]); 

我需要添加約束爲name領域。這意味着它只能接受該字段的字符。但字段名稱是一個文本數組。

我想這個檢查約束:

Alter table student 
add constraint stud_const check (ALL(name) NOT LIKE '%[^a-zA-Z]%'); 

但它拋出這個錯誤:

ERROR: syntax error atERROR: syntax error at or near "all" 
LINE 1: ... student add constraint stud_const check (all(name) ... 
or near "all" 

我怎麼能解決這個問題? constraint應該設置爲整個陣列

+0

這個數組的目的是什麼?一個學生應該有多個名字嗎? – joop

+0

是的,我會在這裏存儲名字和姓氏 – Ganapathy

回答

2

有必要unnest數組它匹配到regular expression

select bool_and (n ~ '^[a-zA-Z]*$') 
from unnest(array['John','Mary']) a(n) 
; 
bool_and 
---------- 
t 

bool_and。因爲它是不可能的檢查約束中使用子查詢包裝在一個函數:

create function check_text_array_regex (
    a text[], regex text 
) returns boolean as $$ 

    select bool_and (n ~ regex) 
    from unnest(a) s(n); 

$$ language sql immutable; 

,並在檢查約束使用的功能:

create table student (
    id serial, 
    name text[] check (check_text_array_regex (name, '^[a-zA-Z]*$')) 
); 

測試:

insert into student (name) values (array['John', 'Mary']); 
INSERT 0 1 

insert into student (name) values (array['John', 'Mary2']); 
ERROR: new row for relation "student" violates check constraint "student_name_check" 
DETAIL: Failing row contains (2, {John,Mary2}).