因此,无论约束以哪种形式定义,都可以通过 ALTER TABLE .. DROP CONSTRAINT .. 删除。系统目录中并不存在“列约束”的特殊标识,它只是作用于单列的表约束。
下面的查询用于查看两个示例表中的约束定义:
SELECT
rel.relname AS table_name,
c.conname,
c.contype,
c.conrelid::regclass AS table_ref,
c.conkey,
pg_get_constraintdef(c.oid, true) AS constraint_def
FROM pg_constraint c
JOIN pg_class rel ON rel.oid = c.conrelid
WHERE rel.relname IN ('products_oct', 'products_nov');
⚡ 查询要点说明
什么是域
域可以理解为“带约束的数据类型”。它基于已有类型(如 text、integer),但可以附加 NOT NULL、CHECK 约束或默认值,用于集中定义数据规则。
示例如下:
CREATE DOMAIN email_address AS text
CHECK (VALUE ~* '^[^@]+@[^@]+\.[^@]+$');
CREATE TABLE users (
id serial PRIMARY KEY,
email email_address NOT NULL
);
-- This will fail
INSERT INTO users(email) VALUES ('not-an-email');
-- This will be successful
INSERT INTO users(email) VALUES ('ok@example.com');
上述示例中定义了一个名为 email_address 的新类型。所有使用该类型的列,在插入或更新数据时都会自动校验正则表达式。即使表本身未显式定义 CHECK 约束,非法值仍会被拒绝。
SELECT c.conname,
pg_get_constraintdef(c.oid, true) AS definition,
t.typname AS domain_name
FROM pg_constraint c
JOIN pg_type t ON t.oid = c.contypid
WHERE c.contype = 'c'
AND c.contypid <> 0;
⚡ 查询要点说明