在PostgreSQL

时间:2015-06-17 07:25:05

标签: postgresql constraints check-constraints

有没有办法强制跨越表的数据库逻辑?作为一个非常简单的超级简化示例,想象一下两桌发票系统:

create table accounts (id serial primary key, balance integer not null default 0);
create table invoices (id serial primary key, acct integer references accounts, total integer not null);

提高发票包括在发票表中插入一行,并使用新余额更新帐户表。 (是的,我知道这里存在规范化问题,但是还有其他原因希望余额存在于主表中。此外,这非常简单。)

此处有一个不变量:对于任何指定的帐户,(select balance from accounts where id=N)==(select sum(total) from invoices where acct=N) - 或者换句话说,select acct,sum(total) from invoices group by acct应该与select id,balance from accounts相同(尽管后者将为零)那些没有发票的人。)

有没有办法在PostgreSQL中强制执行此操作?我宁愿不必信任客户代码。

1 个答案:

答案 0 :(得分:1)

我认为你还需要一个触发器。捕获Before Insert或After Insert事件,以及Before Update或After Update事件。 (我曾经捕获过,但为了便携性的原因,现在我赶上了之后) 在插入和更新时,您还会更新所需的所有列。 这里是如何构建触发器的:https://stackoverflow.com/questions/30824126/postgresql-how-to-autofill-column-based-on-other-previous-values/30824693?noredirect=1#comment49795847_30824693