Как удалить безымянное проверочное ограничение в таблице 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_nameзапись которого была foo pkeyсвязана с ограничением первичного ключа, а не моей проверкой priceстолбца. Так что этот ответ не помог мне, если я что-то упустил.

Как я могу снять это ограничение, не теряя никаких данных?

Спасибо!

kilgoretrout
источник

Ответы:

10

Ограничение имеет имя независимо от того, указали вы его или нет.

Начиная с psql, \d fooбудут перечислены все ограничения таблиц, а также их автоматически назначенные имена.

Вы также можете найти их, запросив таблицы каталога напрямую:

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

При необходимости имя таблицы может быть дополнено схемой (например 'public.foo'::regclass).

contype = 'c'фильтрует его до CHECKограничений; то contypeзначение для других типов ограничений описаны здесь .

Ник Барнс
источник