Уникальный индекс Postgres для текстового массива - PullRequest
0 голосов
/ 03 октября 2018

Как добавить уникальный индекс для столбца текстового массива.

В моей таблице Postgres есть столбец, содержащий разделы.

 +----+-----------+
 | id |  sections |
 |----|-----------|
 |  1 |['A', 'B'] |
 +----+-----------+
 |  2 |['A', 'A'] |
 +----+-----------+

Как вы можете видеть для id 2Я могу вставить два раздела с одинаковым текстом.Я не хочу добавлять дубликаты текста.Я не хочу дублировать разделы в моей колонке.Есть ли способ добавить индекс для текстового массива.

Я видел примеры для массива int, но ничего не могу найти для текстового массива

Я не хочу создавать новую функцию,Я хочу использовать существующую функцию в Postgres.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете добавить в столбец разделов и удалить их с помощью отдельного элемента, например:

update class set sections = array(
    select distinct unnest(
        array_append(
            (select section from class where id = 2), 'A'))
    where id = 2)
0 голосов
/ 09 октября 2018

Мне нравятся массивы и не всегда хорошо нормализовать таблицы: -)

CREATE OR REPLACE FUNCTION is_not_unique(a int[]) RETURNS bool AS $f$
   SELECT array_upper(a, 1) = array_upper(
               (
                SELECT array_agg(DISTINCT u)
                  FROM unnest(a) AS u
          ), 1);
$f$ LANGUAGE sql;

CREATE TEMP TABLE a (a int[], CHECK (is_not_unique(a)));

Проверьте это:

# INSERT INTO a VALUES (ARRAY[1]);
INSERT 0 1
# INSERT INTO a VALUES (ARRAY[1, 2]);
INSERT 0 1
# INSERT INTO a VALUES (ARRAY[1, 1]);
ERROR:  new row for relation "a" violates check constraint "a_a_check"
DETAIL:  Failing row contains ({1,1}).
...