Вы можете использовать триггер для имитации уникального ограничения с вашими желаемыми свойствами.Что-то вроде этого поможет:
create or replace function sort_of_unique() returns trigger as $$
declare
got_one boolean;
begin
select exists(
select 1
from your_table
where header_id != new.header_id
and value = new.value
) into got_one;
if got_one then
raise exception 'Uniqueness violation in your_table';
end if;
return new;
end;
$$ language plpgsql;
create trigger sort_of_unique_trigger
before insert or update on your_table
for each row execute procedure sort_of_unique();
Тогда вы получите такие вещи:
=> insert into your_table (id, header_id, value) values (1, 1, 'a');
=> insert into your_table (id, header_id, value) values (2, 1, 'a');
=> insert into your_table (id, header_id, value) values (3, 2, 'a');
ERROR: Uniqueness violation in your_table
=> insert into your_table (id, header_id, value) values (3, 2, 'b');
=> update your_table set value = 'a' where id = 3;
ERROR: Uniqueness violation in your_table
Вы можете создать частичные уникальные индексы , прикрепивпредложение WHERE для индекса.Это позволяет вам применить ограничение уникальности к фрагментам таблицы;однако я не могу придумать, как в предложении WHERE указать «антислайс», поэтому я не вижу способа заставить эту работу работать с частичным индексом.Хотя я мог упустить что-то очевидное.