为表中的控件插入创建约束条件

问题描述 投票:0回答:1

有两个表--订单和服务列表。在第一个表中有一个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层面上编写一些复杂的约束或外键来检查条件?

sql postgresql insert constraints
1个回答
1
投票

最新版本的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 这将使外键约束无效。

© www.soinside.com 2019 - 2024. All rights reserved.