尽管这个问题已经过去了多年,但我想为讲西班牙语的人澄清一下,这些测试已在Postgres中完成:
以下约束已添加到1337条记录的表中,其中该工具包是主键:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
这会为表创建一个默认的主键NOT DEFERRED,因此在尝试下一个UPDATE时会出现错误:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
错误:重复键违反了唯一性限制«unique_div_nkit»
在Postgres中,对每个ROW执行UPDATE都会验证是否满足RESTRICTION或CONSTRAINT。
现在创建了CONSTRAINT IMMEDIATE,并且分别执行了每个语句:
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
查询正常,受影响的0行(执行时间:0 ms;总时间:0 ms)查询正常,受影响的1328行(执行时间:858 ms;总时间:858 ms)错误:将取消«unique_div_nkit»的详细信息:您的存在(div_nkit)=(1338)。
在这里,SI允许更改主键,因为它执行了整个第一完整句子(1328行)。但是,尽管它处于事务处理(BEGIN)中,但在完成每个语句而没有进行COMMIT时会立即验证CONSTRAINT,因此在执行INSERT时会产生错误。最后,我们创建了CONSTRAINT DEFERRED,请执行以下操作:
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
如果我们分别对每个语句分别执行**块2 **的每个语句,则不会对INSERT生成任何错误,因为它不进行验证,但是最终COMMIT在发现不一致的地方执行。
有关英文的完整信息,建议您检查以下链接:
深度的可延迟SQL约束
不可延迟与立即可延迟