0

私はテーブルを持っています。小文字の文字列のみを受け入れ、Ñóáöäëなどの特殊文字は使用できません。小文字のみを許可/変換するPostgresのテキスト列。Ñöèè

この制約を列に追加する方法はありますか?

CREATE TABLE lawyer (
    id SERIAL PRIMARY KEY, 
    name VARCHAR NOT NULL, 
    url_name VARCHAR NOT NULL, 
    gender VARCHAR(1) check (gender in ('m','f')) NOT NULL 
); 

私は制約を追加したい列はURL_NAME

答えて

3

あるこのtranslate()コールの2番目のパラメータで目的の文字を入れてください:

CREATE TABLE lawyer (
    id SERIAL PRIMARY KEY, 
    name VARCHAR NOT NULL, 
    url_name VARCHAR check(translate(url_name, 'abcdefghijklmnopqrstuvwxyz', '') = '') NOT NULL, 
    gender VARCHAR(1) check (gender in ('m','f')) NOT NULL 
); 

insert into lawyer 
values (default, 'Adam Smith', 'domain', 'f'); 

INSERT 0 1 

insert into lawyer 
values (default, 'Adam Smith', 'dömain', 'f'); 

ERROR: new row for relation "lawyer" violates check constraint "lawyer_url_name_check" 
DETAIL: Failing row contains (3, Adam Smith, dömain, f). 

を別の方法としては、トリガーを作成することができますその場で値を変更する:

create or replace function lawyer_before_insert_or_update() 
returns trigger language plpgsql as $$ 
begin 
    new.url_name := lower(new.url_name); 
    if translate(new.url_name, 'abcdefghijklmnopqrstuvwxyz', '') <> '' then 
     raise exception 'Incorrect url name.'; 
    end if; 
    return new; 
end $$; 

create trigger lawyer_before_insert_or_update 
before insert or update on lawyer 
for each row execute procedure lawyer_before_insert_or_update(); 

insert into lawyer 
values (default, 'Adam Smith', 'DOMAIN', 'f') 
returning *; 

id | name | url_name | gender 
----+------------+----------+-------- 
    4 | Adam Smith | domain | f 
(1 row) 

INSERT 0 1 

insert into lawyer 
values (default, 'Adam Smith', 'dömain', 'f'); 

ERROR: Incorrect url name. 
+0

ありがとう、そこには、url_nameを小文字にする制約や方法がありますか? – Jeka

+0

制約は、値をチェック(および間違って拒否)することしかできません。入力時に値を変更するにはトリガーが必要です。編集された答えを参照してください。 – klin

1

変換(小文字に変換するなど)の場合、私はトリガーに同意します。ただし、許可された文字については、これが繰り返し必要な場合は、ドメインを使用することをお勧めします。

のような何か:

create domain lower_ascii AS text check VALUE ~ '^[a-z]*$'; 

ドメインは、彼らがすべての用途間で、単一の管理ポイントを提供し、要件が変更した場合は、グローバルチェック制約を変更することができるという事実を含むカップルの利点を有しています。

+0

ありがとうございます! – Jeka

関連する問題