Thread

  1. doc: Clarify ALTER CONSTRAINT enforceability wording

    Chao Li <li.evan.chao@gmail.com> — 2026-05-25T09:31:07Z

    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/