2016-08-02 4 views
4

内のテキスト列のチェック制約を設定PostgreSQL内のフィールドとしてidnameで、studentと呼ばれる:は、私はテーブルを抱えている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

regular expressionに一致するようにunnest配列する必要がある:

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}). 
関連する問題