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


9

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

CREATE TABLE FOO
(
id serial primary key,
price_range smallint CHECK (price_range > 0),
url varchar(255)
);

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

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

SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = 'your_table'

我得到的只是一个约束,其约束条件constraint_namefoo pkey指主键约束,而不是我对该price列的检查。因此,除非我丢失了某些内容,否则该答案无济于事。

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

谢谢!

Answers:


10

约束是否具有名称,无论您是否指定它。

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

您也可以通过直接查询目录表来找到它们:

SELECT conname
FROM pg_constraint
WHERE
  conrelid = 'foo'::regclass AND
  contype = 'c'

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

contype = 'c'过滤到CHECK约束;contype其他约束类型的值在此处记录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.