文本数组上的Postgres唯一索引

时间:2018-10-03 11:00:10

标签: postgresql indexing constraints

如何在文本数组列上添加唯一索引。

我的Postgres表中有一列,其中包含各个部分。

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

您可以看到ID为2,我可以插入两个具有相同文本的部分。我不想添加重复的文本。 我不想在专栏中重复这些部分。 有什么办法可以在文本数组上添加索引。

我看到了int数组的示例,但找不到文本数组的任何内容

我不想创建新功能。我想使用Postgres中的现有功能。

2 个答案:

答案 0 :(得分:2)

您可以添加到sections列中,并使用诸如此类的独特元素来嵌套:

update class set sections = array(
    select distinct unnest(
        array_append(
            (select section from class where id = 2), 'A'))
    where id = 2)

答案 1 :(得分:0)

我喜欢arays,但对表格进行规范化并不总是一件好事:-)

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}).