这个想法是一个大的“尾巴摇狗”的事情。您试图基于业务结构来指示业务逻辑,而不是业务逻辑指示数据库结构。
但这仍然是可能的,例如使用存储过程:
首先,我将创建一些虚拟表:
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