Anda dapat menggunakan larik untuk kolom dan operator "diisi oleh" untuk batasan CHECK:
create table pancakes (
color varchar(10)[] not null,
check (color <@ ARRAY['red', 'green', 'blue']::varchar[])
);
Dan kemudian hal-hal seperti ini terjadi:
=> insert into pancakes values (ARRAY['red']);
INSERT 0 1
=> insert into pancakes values (ARRAY['red','green','blue']);
INSERT 0 1
=> insert into pancakes values (ARRAY['red','green','blue','black']);
ERROR: new row for relation "pancakes" violates check constraint "pancakes_color_check"
=> select * from pancakes;
color
------------------
{red}
{red,green,blue}
(2 rows)
Ini akan memungkinkan {red,red}
di kolom sekalipun; jika tidak mengizinkan {red,red}
penting, maka Anda dapat menambahkan fungsi untuk memeriksa nilai warna unik dalam array dan menyesuaikan batasan CHECK:
create function has_unique_colors(varchar[]) returns boolean as $$
select (select count(distinct c) from unnest($1) as dt(c)) = array_length($1, 1);
$$ language sql;
create table pancakes (
color varchar(10)[] not null,
check (color <@ ARRAY['red', 'green', 'blue']::varchar[] and has_unique_colors(color))
);
Pilihan lain adalah tumpukan tabel asosiasi dengan nilai skalar sederhana di kolom. Namun, ini mungkin rumit jika Anda memiliki enam kolom ini. Anda juga dapat menggunakan versi fungsi Erwin jika Anda perlu khawatir tentang NULL di "set":
create function has_unique_colors(varchar[]) returns boolean as $$
select not exists(select c from unnest($1) dt(c) group by 1 having count(*) > 1);
$$ language sql;