Идея - большая вещь "хвост виляет собакой". Вместо того, чтобы ваша бизнес-логика диктовала структуру БД, вы пытаетесь диктовать бизнес-логику на основе бизнес-структуры.
Но это все еще возможно, используя хранимые процедуры, например:
Сначала я создам несколько фиктивных таблиц:
create table CUSTOMER_CONTRACT (id int PRIMARY KEY );
create table CUSTOMER_CONTRACT_REF (id int PRIMARY KEY,
customer_id int REFERENCES CUSTOMER_CONTRACT(id));
Теперь к хранимой процедуре:
create or REPLACE function can_delete_contract(id int) returns boolean AS $$
BEGIN
delete from CUSTOMER_CONTRACT c
where c.ID = 1;
return true;
EXCEPTION
WHEN FOREIGN_KEY_VIOLATION then
return false;
END;
$$ LANGUAGE plpgsql;
В случае исключения автоматически произойдет откат.
Теперь к некоторому тестированию:
select can_delete_contract(1); // true
insert into CUSTOMER_CONTRACT values (1);
select can_delete_contract(1); // true
insert into CUSTOMER_CONTRACT values (1);
insert into CUSTOMER_CONTRACT_REF values(1, 1);
select can_delete_contract(1); // false