有两个表--订单和服务列表。在第一个表中有一个bool字段,表示订单已被批准,如果为真,那么就不能在第二个表中插入删除值。有了第一个表的UPDATE和第二个表的DELETE,就清楚了。
INSERT使为
INSERT INTO b (a_id, b_value)
SELECT *
FROM (VALUES (1, 'AA1-BB1'),(1, 'AA1-BB2'),(1, 'AA1-BB3')) va
WHERE (SELECT NOT confirm FROM a WHERE a_id = 2);
https:/dbfiddle.uk?rdbms=postgres_12&fiddle=7b0086967c1c38b0c80ca5624ebe92e9。
如何禁止没有触发器和存储过程的插入?是否可以在DBMS层面上编写一些复杂的约束或外键来检查条件?
最新版本的Postgres支持生成列。 所以,你可以这样做。
alter table b add confirm boolean generated always as (false) stored;
然后创建一个唯一的键 a
:
alter table a add constraint unq_a_confirm_id unique (confirm, id);
最后是外国钥匙关系。
alter table b add constraint fk_b_a_id_confirm
foreign key (confirm, a_id) references a(confirm, id);
现在,只有 confirmed = false
ID可以使用。 请注意,这将阻止对 a
这将使外键约束无效。