【问题标题】:Postgres constraint name need to be unique across single table or entire schema?Postgres 约束名称需要在单个表或整个架构中是唯一的?
【发布时间】:2020-12-08 20:16:47
【问题描述】:

我试图理解为什么某些 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

【问题讨论】:

    标签: postgresql constraints exclude-constraint


    【解决方案1】:

    为什么名称 my_constraint_1 可以在不同的表中使用相同的名称,而 my_constraint_2 必须是唯一的

    约束 2 具有同名的底层索引,而约束 1 是表级别的简单检查约束。

    EXCLUDE 排除约束是使用索引实现的,因此每个指定的运算符都必须与索引访问方法 index_method 的适当运算符类(参见第 11.10 节)相关联。

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

    db<>fiddle demo

    【讨论】:

    • 在约束同名的情况下,有没有办法强制索引名称不同?
    • @DevilingMaster 有趣的问题,我看不到允许给出其他名称的语法(但我也不是说不可能)
    • @DevilingMaster 否,索引必须始终与约束同名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多