Postgres 约束名称需要在单个 table 或整个模式中是唯一的?

Postgres constraint name need to be unique across single table or entire schema?

我试图理解为什么一些 Postgres 约束可以在不同的表中命名为相同的,而有些则不能

这里有一个简单的例子:

drop table if exists public.table_1;
drop table if exists public.table_2;

CREATE TABLE public.table_1 (
    id serial NOT NULL,
    date_start date NOT NULL,
    date_end date NULL
);

CREATE TABLE public.table_2 (
    id serial NOT NULL,
    date_start date NOT NULL,
    date_end date NULL
);


alter table public.table_1 add constraint my_constraint_1 check (date_start > now());
alter table public.table_2 add constraint my_constraint_1 check (date_start > now());


alter table public.table_1 add constraint my_constraint_2 EXCLUDE USING gist (daterange(date_start, coalesce(date_end, 'infinity'),  '[]') WITH &&);
alter table public.table_2 add constraint my_constraint_2 EXCLUDE USING gist (daterange(date_start, coalesce(date_end, 'infinity'),  '[]') WITH &&);

如您所见,我可以对不同的表使用相同的名称 my_constraint_1

为什么名称 my_constraint_1 可以在不同的表中使用相同的名称,而 my_constraint_2 必须是唯一的,否则我会得到错误 Errore SQL [42P07]: ERROR: relation "my_constraint_2" already exists?

Why the name my_constraint_1 can be used as the same in different tables, while my_constraint_2 must be unique

约束 2 具有同名的基础索引,而约束 1 是 table 级别的简单检查约束。

EXCLUDE Exclusion constraints are implemented using an index, so each specified operator must be associated with an appropriate operator class (see Section 11.10) for the index access method index_method.

CREATE INDEX my_constraint_2 ON public.table_1 USING gist (daterange(date_start, COALESCE(date_end, 'infinity'::date), '[]'::text))

db<>fiddle demo