2016-08-02 4 views
4

Я имею таблицу с именем student, с id и name как поля в PostgreSQL:Установите проверочное ограничение для текста массива в 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}).