我有一张记录表
ID
EntityID
Value
Status
和实体表
ID
Col1
Col2
CurrentRecordID
CurrentRecordID
应与Record
绑定Entity
,Status
为0
我有两个检查约束
一个在表Entity
上检查以确保CurrentRecordID
实际上是当前记录,而Record
上的一个检查以确保,如果它的状态为0,则EntityID
{ {1}}的{{1}}与其ID相匹配。
基本上,两个检查约束做同样的事情,但是在每个表上分别进行
检查约束是在事务的最后运行还是在表上每次插入/更新后都像触发器一样运行?
如果它们在每次修改后运行,这两个约束是否会相互冲突(意味着约束会在下一个表有机会更新其值之前抛出错误)。
以下是运行以插入新记录的查询示例,并将其设置为给定实体的当前记录
CurrentRecordID
答案 0 :(得分:2)
约束不像触发器一样运行。他们在更改数据之前评估规则。
尝试更改数据时会发生约束检查。如果尝试更改为Table1未通过检查约束,则它将通过异常。
答案 1 :(得分:0)
为完成Sean Lange的解释,请允许我留下一个随时可以运行的示例,以便亲眼看看在修改任何数据之前如何执行table check
。
CREATE TABLE pepe (
id serial,
state text NOT NULL
);
ALTER TABLE pepe ADD CONSTRAINT pepe_pk PRIMARY KEY (id);
ALTER TABLE pepe ADD CONSTRAINT pepe_check
CHECK (pepe_check_func());
CREATE OR REPLACE FUNCTION pepe_check_func() RETURNS boolean AS
$BODY$
DECLARE
temp_row record;
BEGIN
RAISE INFO 'Displaying existing pepe records';
FOR temp_row IN
SELECT id,state
FROM pepe
LOOP
RAISE INFO '(id,state) = (%,%)',temp_row.id, temp_row.state;
END LOOP;
RETURN TRUE;
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE;
insert into pepe (state) values ('go');
update pepe
set state = 'active';
select *
from pepe;