Вы можете создать индекс unique
, который реализует проверку:
create unique index t_txt_unique on t(regexp_replace(txt, '\W', '', 'g'));
Регулярное выражение удаляет из строки все несловарные символы, сохраняя только буквы алфавита c и символы подчеркивания _
, Вы можете настроить класс символов по мере необходимости.
Демонстрация на DB Fiddle :
create table t (id int, txt citext);
create unique index t_txt_unique on t(regexp_replace(txt, '\W', '', 'g'));
insert into t values(1, 'HelloWorld');
-- ok
insert into t values(1, 'Hello World');
-- ERROR: duplicate key value violates unique constraint "t_txt_unique"
-- DETAIL: Key (regexp_replace(txt, '\W'::text, ''::text, 'g'::text))=(HelloWorld) already exists.
insert into t values(1, 'Hello%$^&*W^%orld');
-- ERROR: duplicate key value violates unique constraint "t_txt_unique"
-- DETAIL: Key (regexp_replace(txt, '\W'::text, ''::text, 'g'::text))=(HelloWorld) already exists.
insert into t values(1, 'Hello Mars');
-- ok