有没有办法强制跨越表的数据库逻辑?作为一个非常简单的超级简化示例,想象一下两桌发票系统:
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中强制执行此操作?我宁愿不必信任客户代码。
答案 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