Как добавить уникальное ограничение (игнорируя специальные символы) для текстового столбца в postgres? - PullRequest
2 голосов
/ 14 января 2020

Как добавить уникальное ограничение (игнорируя специальные символы) для текстового столбца в Postgres?

CREATE TABLE my_table(
    SomeTextColumn citext
CONSTRAINT person_u_1 UNIQUE (SomeTextColumn)
);

В приведенной выше таблице я пытаюсь добавить уникальное ограничение, которое будет искать уникальность игнорируя специальные символы во входящих данных

For example:
1. HelloWorld --> Gets inserted successfully
2. Hello World --> Should fail with duplicate constraint
2. Hello%$^&*W^%orld --> Should fail with duplicate constraint

1 Ответ

4 голосов
/ 14 января 2020

Вы можете создать индекс 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
...