PostgreSQL: 默认约束名称

在 PostgreSQL 中创建表时,如果没有提供默认约束名称,则会指定:

CREATE TABLE example (
a integer,
b integer,
UNIQUE (a, b)
);

但使用 ALTER TABLE添加一个约束似乎是强制性的:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

这导致了我所从事的项目中的一些命名不一致,并引发了以下问题:

  1. 有没有一种简单的方法可以将一个约束添加到一个现存表中,并使用在创建表时添加该约束时将会接收到的名称?

  2. 如果没有,是否应该完全避免默认名称以防止不一致?

51502 次浏览

The standard names for indexes in PostgreSQL are:

{tablename}_{columnname(s)}_{suffix}

where the suffix is one of the following:

  • pkey for a Primary Key constraint
  • key for a Unique constraint
  • excl for an Exclusion constraint
  • idx for any other kind of index
  • fkey for a Foreign key
  • check for a Check constraint

Standard suffix for sequences is

  • seq for all sequences

Proof of your UNIQUE-constraint:

NOTICE: CREATE TABLE / UNIQUE will create implicit index "example_a_b_key" for table "example"

The manual is pretty clear about this ("tableconstraint: This form adds a new constraint to a table using the same syntax as CREATE TABLE.")

So you can simply run:

ALTER TABLE example ADD UNIQUE (a, b);