gpt4 book ai didi

postgresql - Postgres 约束名称需要在单个表或整个架构中是唯一的吗?

转载 作者:行者123 更新时间:2023-12-04 08:27:11 32 4
gpt4 key购买 nike

我试图理解为什么一些 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不同的 table
enter image description here
为什么取这个名字 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 是表级别的简单检查约束。

EXCLUDEExclusion 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

关于postgresql - Postgres 约束名称需要在单个表或整个架构中是唯一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65206269/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com