Search code examples
arrayspostgresqlunique-constraint

Postgres UNIQUE CONSTRAINT for array


How to create a constraint on the uniqueness of all the values ​​in the array like:

CREATE TABLE mytable
(
    interface integer[2],
    CONSTRAINT link_check UNIQUE (sort(interface))
)

my sort function

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; 

I need that would be the value {10, 22} and {22, 10} considered the same and check under the UNIQUE CONSTRAINT


Solution

  • I don't think you can use a function with a unique constraint but you can with a unique index. So given a sorting function something like this:

    create function sort_array(anyarray) returns anyarray as $$
        select array_agg(distinct n order by n) from unnest($1) as t(n);
    $$ language sql immutable;
    

    Then you could do this:

    create table mytable (
        interface integer[2] 
    );
    create unique index mytable_uniq on mytable (sort_array(interface));
    

    Then the following happens:

    => insert into mytable (interface) values (array[11,23]);
    INSERT 0 1
    => insert into mytable (interface) values (array[11,23]);
    ERROR:  duplicate key value violates unique constraint "mytable_uniq"
    DETAIL:  Key (sort_array(interface))=({11,23}) already exists.
    => insert into mytable (interface) values (array[23,11]);
    ERROR:  duplicate key value violates unique constraint "mytable_uniq"
    DETAIL:  Key (sort_array(interface))=({11,23}) already exists.
    => insert into mytable (interface) values (array[42,11]);
    INSERT 0 1