名前のないチェック制約をPostgresQLテーブルにどのように削除しますか?


9

PostgresQLテーブルを作成しましたが、名前のないチェック制約を列の1つに追加しました。

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 pkeyprice

データを失わずにこの制約を削除するにはどうすればよいですか?

ありがとう!

回答:


10

指定したかどうかに関係なく、制約には名前があります。

psqlから\d foo、自動的に割り当てられた名前とともに、すべてのテーブル制約をリストします。

これらは、カタログテーブルを直接クエリすることでも見つけることができます。

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

テーブル名は、必要に応じてスキーマで修飾できます(例:)'public.foo'::regclass

contype = 'c'それをCHECK制約にフィルタリングします。contype他の制約のタイプの値が文書化されてここに

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.