public inbox for [email protected]  
help / color / mirror / Atom feed
From: Chao Li <[email protected]>
To: PostgreSQL Hackers <[email protected]>
Cc: Andrew Dunstan <[email protected]>
Cc: jian he <[email protected]>
Subject: doc: Clarify ALTER CONSTRAINT enforceability wording
Date: Mon, 25 May 2026 17:31:07 +0800
Message-ID: <[email protected]> (raw)

Hi,

I just started to test “Add support for altering CHECK constraint enforceability”. I read the related ALTER TABLE doc first, and found it a bit confusing:
```
ALTER CONSTRAINT 
    This form alters the attributes of a constraint that was previously created. Currently FOREIGN KEY and CHECK constraints may be altered in this fashion, but see below.
```

In the feature commit 342051d73, only “CHECK" was added:
```
--- a/doc/src/sgml/ref/alter_table.sgml
+++ b/doc/src/sgml/ref/alter_table.sgml
@@ -578,8 +578,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     <listitem>
      <para>
       This form alters the attributes of a constraint that was previously
-      created. Currently only foreign key constraints may be altered in
-      this fashion, but see below.
+      created. Currently <literal>FOREIGN KEY</literal> and <literal>CHECK</literal>
+      constraints may be altered in this fashion, but see below.
      </para>
```

However, the last phrase “but see below” is quite confusing. I read the doc several times up and down, and finally my best guess is that “see below” refers to the immediately following paragraph’s sentence “Only not-null constraints may be altered in this fashion at present”, but the sentence does not say anything about enforceability.
```
ALTER CONSTRAINT ... INHERIT
ALTER CONSTRAINT ... NO INHERIT 
      These forms modify an inheritable constraint so that it becomes not inheritable, or vice-versa. **Only not-null constraints may be altered in this fashion at present.** In addition to changing the inheritability status of the constraint, in the case where a non-inheritable constraint is being marked inheritable, if the table has children, an equivalent constraint will be added to them. If marking an inheritable constraint as non-inheritable on a table with children, then the corresponding constraint on children will be marked as no longer inherited, but not removed.
```

As I understand it, the current behavior is:
 * Deferrability attributes can only be altered for FOREIGN KEY constraints
 * Enforceability attributes can be altered for both FOREIGN KEY and CHECK constraints, and CHECK support was newly added by 342051d73 for v19

To remove the confusion, I updated the documentation. See the attached patch for details.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/






Attachments:

  [application/octet-stream] v1-0001-doc-Clarify-ALTER-CONSTRAINT-enforceability-behav.patch (2.1K, 2-v1-0001-doc-Clarify-ALTER-CONSTRAINT-enforceability-behav.patch)
  download | inline diff:
From 321421de15be0a09ae5cd71317d0deeb50173c9b Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <[email protected]>
Date: Mon, 25 May 2026 16:59:21 +0800
Subject: [PATCH v1] doc: Clarify ALTER CONSTRAINT enforceability behavior

The ALTER TABLE documentation said that FOREIGN KEY and CHECK
constraints may be altered, but did not distinguish between
deferrability and enforceability attributes.

Clarify that deferrability attributes can currently be altered only for
FOREIGN KEY constraints, while enforceability can be altered for both
FOREIGN KEY and CHECK constraints.  Also document that setting a
constraint to ENFORCED verifies existing rows and resumes checking new
or updated rows.

Author: Chao Li <[email protected]>
---
 doc/src/sgml/ref/alter_table.sgml | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml
index dec34337d1a..af247d82902 100644
--- a/doc/src/sgml/ref/alter_table.sgml
+++ b/doc/src/sgml/ref/alter_table.sgml
@@ -586,8 +586,18 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     <listitem>
      <para>
       This form alters the attributes of a constraint that was previously
-      created. Currently <literal>FOREIGN KEY</literal> and <literal>CHECK</literal>
-      constraints may be altered in this fashion, but see below.
+      created.  Currently, the deferrability attributes can be altered only
+      for <literal>FOREIGN KEY</literal> constraints.  The enforceability
+      attribute can be altered for <literal>FOREIGN KEY</literal> and
+      <literal>CHECK</literal> constraints.
+     </para>
+
+     <para>
+      Setting a constraint to <literal>NOT ENFORCED</literal> causes the
+      database system to stop checking it for new or updated rows.  Setting
+      a constraint to <literal>ENFORCED</literal> causes the database system
+      to verify that existing rows satisfy the constraint and to check it
+      for new or updated rows.
      </para>
     </listitem>
    </varlistentry>
-- 
2.50.1 (Apple Git-155)



reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected]
  Subject: Re: doc: Clarify ALTER CONSTRAINT enforceability wording
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox