如何对所有值的唯一性创建约束 在数组中:
CREATE TABLE mytable
(
interface integer[2],
CONSTRAINT link_check UNIQUE (sort(interface))
)
我的排序函数
create or replace function sort(anyarray)
returns anyarray as $$
select array(select $1[i] from generate_series(array_lower($1,1),
array_upper($1,1)) g(i) order by 1)
$$ language sql strict immutable;
我需要将值{10,22}和{22,10}视为相同,并在唯一约束下进行检查
3条答案
按热度按时间gzszwxb41#
我不认为你可以使用一个带有唯一约束的函数,但是你可以使用unique index,所以给定一个排序函数如下:
然后你可以这样做:
然后发生以下情况:
g52tjvyc2#
mu已经演示了index on an expression如何解决您的问题。
我的注意力被使用的函数吸引住了。对于两个整数的数组来说,这两个函数似乎都有些矫枉过正。这可能是真实的情况的简化?无论哪种方式,我都很感兴趣,并用几个变体进行了测试。
测试设置
具有10000个随机整数对的临时表:
用简短的评论来解释每一个测试候选人:
1.与
ORDER BY
内部聚集体相同(第9.0页以上)1.将参数更改为
int[]
1.简化
array_lower()
-始终为11.进一步简化为具有2个元件的情况
1.我的简单查询
1.不使用
STRICT
修饰符(!)结果
我分别执行了大约20次,并从
EXPLAIN ANALYZE
中获得了最佳结果。这些是在Debian Squeeze上的v9.0.5服务器上的结果。v.8.4上的结果类似。
我还测试了PL/pgSQL变体,它们的速度比预期的要慢一些:对于一个小操作来说开销太大,没有查询计划要缓存。
**简单函数(编号7)比其他函数快得多。这是意料之中的,其他变体的开销对于一个小数组来说太多了。
离开
STRICT
声明超过加倍的速度。我没想到,并张贴了以下后续发现原因:wlwcrazw3#
只需在两个值上创建一个唯一索引: