DEFERRABLE 与 IMMEDIATE 主键约束的强制执行
PostgreSQL 中延迟/可延迟唯一或主键约束的强制执行取决于其设置和正在执行的操作类型。
对于定义为的约束DEFERRABLE INITIALLY IMMEDIATE,在执行每个 SQL 语句后检查唯一性。但是,需要注意的是,对于 UNIQUE 或 PRIMARY KEY 约束,手册规定,无论延迟性设置如何,都会在每个命令之后立即进行唯一性检查。
查询中提供的示例演示了 UPDATE 语句即使约束被定义为 PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE,也允许成功修改多行。这是因为检查发生在语句执行之后,在这种情况下,约束仍然满足。
相反,如果 PK 约束为,尝试更新多个表中的行的数据修改 CTE 可能会失败没有推迟。这是因为CTE中的每个子语句都是并发执行的,并且没有快照隔离,更新的顺序是不可预测的。因此,可能会发生唯一键违规。
如果在单个事务中执行多个 UPDATE 语句而没有显式将约束设置为延迟,则如果约束未延迟,则可能会发生 UNIQUE 违规。这是因为检查是在每个语句之后执行的,并且在事务的中间状态期间可能会违反约束。
因此,很明显,PostgreSQL 中不可延迟的 UNIQUE 或 PRIMARY KEY 约束的行为是本质上是有缺陷的。检查是在每行更新后执行的,这在某些情况下可能会导致意外失败。但是,此问题的解决方法是使用 DEFERRABLE 约束,它在强制唯一性方面提供了更大的灵活性,并可以防止不必要的错误。
以上是PostgreSQL 的延迟与立即主键约束强制执行如何影响事务行为?的详细内容。更多信息请关注PHP中文网其他相关文章!