Domain

Constrained alias over a base type with DOMAIN name AS type.

Basic domain

SCHEMA public {
    DOMAIN positive_integer AS INTEGER {
        DEFAULT 1;
        CONSTRAINT positive_only  CHECK (VALUE > 0);
        CONSTRAINT reasonable_max CHECK (VALUE < 1000000);
    }
}
-- emits
CREATE DOMAIN "public"."positive_integer" AS integer
    DEFAULT 1
    CONSTRAINT "positive_only"  CHECK (VALUE > 0)
    CONSTRAINT "reasonable_max" CHECK (VALUE < 1000000);

Domain with NOT NULL

SCHEMA public {
    DOMAIN email_address AS TEXT {
        NOT NULL;
        CONSTRAINT valid_email CHECK (VALUE ~ '^[^@]+@[^@]+\.[^@]+$');
    }
}
-- emits
CREATE DOMAIN "public"."email_address" AS text
    NOT NULL
    CONSTRAINT "valid_email" CHECK (VALUE ~ '^[^@]+@[^@]+\.[^@]+$');

Altering a domain constraint

Adding a new constraint emits ALTER DOMAIN ADD CONSTRAINT. Removing one emits ALTER DOMAIN DROP CONSTRAINT. Changing the base type or a NOT NULL constraint is DESTRUCTIVE.

-- add a new constraint (SAFE)
DOMAIN positive_integer AS INTEGER {
    DEFAULT 1;
    CONSTRAINT positive_only  CHECK (VALUE > 0);
    CONSTRAINT reasonable_max CHECK (VALUE < 1000000);
    CONSTRAINT even_only      CHECK (VALUE % 2 = 0);
}
-- emits
ALTER DOMAIN "public"."positive_integer" ADD CONSTRAINT "even_only" CHECK (VALUE % 2 = 0);