如何在文本数组列上添加唯一索引。
我的Postgres表中有一列,其中包含各个部分。
+----+-----------+
| id | sections |
|----|-----------|
| 1 |['A', 'B'] |
+----+-----------+
| 2 |['A', 'A'] |
+----+-----------+
您可以看到ID为2
,我可以插入两个具有相同文本的部分。我不想添加重复的文本。
我不想在专栏中重复这些部分。
有什么办法可以在文本数组上添加索引。
我看到了int数组的示例,但找不到文本数组的任何内容
我不想创建新功能。我想使用Postgres中的现有功能。
答案 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}).