0

我有 2 个带有外键约束的简单表:

CREATE TABLE a(i integer);
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i);
CREATE TABLE b(j integer);
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j) REFERENCES a (i);

我想在交易期间推迟约束

START TRANSACTION;
SET CONSTRAINTS fkey_ij DEFERRED;

我收到以下错误:

[42809] ERROR: constraint "fkey_ij" is not deferrable

我正在阅读postgresSET CONSTRAINTS文档,但不明白为什么这个约束没有资格被推迟:

目前,只有 UNIQUE、PRIMARY KEY、REFERENCES(外键)和 EXCLUDE 约束受此设置影响。NOT NULL 和 CHECK 约束总是在插入或修改行时立即检查(而不是在语句末尾)。还立即检查尚未声明 DEFERRABLE 的唯一性和排除性约束。

我是否遗漏了文档中的某些内容?

4

1 回答 1

2

A) 文档链接适用于版本 9.1,该版本已经过 EOL(约 5.25 年)。

B)是的,你错过了下一段:

在创建时,约束被赋予以下三个特征之一:DEFERRABLE INITIALLY DEFERRED、DEFERRABLE INITIALLY IMMEDIATE 或 NOT DEFERRABLE。.

因此,需要将约束创建为 DEFERRABLE 或对其进行更改。请参阅更改表

ALTER CONSTRAINT 约束名称 [ DEFERRABLE | 不可延期 ] [ 最初延期 | 最初立即]

于 2022-02-18T19:29:18.067 回答