如何在 PostgresQL 表中删除未命名的检查约束?

kil*_*out 11 postgresql

我创建了一个 PostgresQL 表,但我在其中一列上添加了一个未命名的检查约束:

CREATE TABLE FOO
(
id serial primary key,
price_range smallint CHECK (price_range > 0),
url varchar(255)
);
Run Code Online (Sandbox Code Playgroud)

现在我想删除这个约束,但我不知道如何。典型的 ALTER TABLE...DROP CONSTRAINT... 需要一个,constraint_name但我没有。

我知道这里有一个答案但是当我尝试按照那里的答案确定检查约束的名称时:

SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = 'your_table'
Run Code Online (Sandbox Code Playgroud)

我得到的只是一个约束,它的constraint_name条目是foo pkey指主键约束,而不是我对price列的检查。所以这个答案对我没有帮助,除非我遗漏了什么。

如何在不丢失任何数据的情况下删除此约束?

谢谢!

Nic*_*nes 11

无论您是否指定,约束都有一个名称。

从 psql 中,\d foo将列出所有表约束,以及它们自动分配的名称。

您还可以通过直接查询目录表来找到这些:

SELECT conname
FROM pg_constraint
WHERE
  conrelid = 'foo'::regclass AND
  contype = 'c'
Run Code Online (Sandbox Code Playgroud)

如有必要,表名可以是模式限定的(例如'public.foo'::regclass)。

contype = 'c'将其过滤到CHECK约束条件;此处contype记录了其他约束类型的值。