Postgresqlで名前による制約の削除


83

名前を知っているだけでPostgresqlに制約名をドロップするにはどうすればよいですか?サードパーティのスクリプトによって自動生成される制約のリストがあります。テーブル名を知らずに制約名だけを削除する必要があります。


どのバージョンのPGを使用していますか?
Kuberchaun 2011年

回答:


135

次のクエリを実行して、テーブル名を取得する必要があります。

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

または、pg_constraintこの情報を取得するために使用できます

select n.nspname as schema_name,
       t.relname as table_name,
       c.conname as constraint_name
from pg_constraint c
  join pg_class t on c.conrelid = t.oid
  join pg_namespace n on t.relnamespace = n.oid
where t.relname = 'your_table_name';

次に、必要なALTERTABLEステートメントを実行できます。

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

もちろん、クエリに完全なalterステートメントを返すようにすることもできます。

SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';'
FROM information_schema.constraint_table_usage
WHERE table_name in ('your_table', 'other_table')

同じテーブルを持つスキーマが複数ある場合は、WHERE句(およびALTERステートメント)にtable_schemaを含めることを忘れないでください。


14

PGの9.xを使用している場合は、DOステートメントを使用してこれを実行できます。a_horse_with_no_nameが行ったことを実行するだけですが、それをDOステートメントに適用します。

DO $$DECLARE r record;
    BEGIN
        FOR r IN SELECT table_name,constraint_name
                 FROM information_schema.constraint_table_usage
                 WHERE table_name IN ('your_table', 'other_table')
        LOOP
            EXECUTE 'ALTER TABLE ' || quote_ident(r.table_name)|| ' DROP CONSTRAINT '|| quote_ident(r.constraint_name) || ';';
        END LOOP;
    END$$;

3

-右の外部キー制約を削除します

ALTER TABLE affiliations
DROP CONSTRAINT affiliations_organization_id_fkey;

注意:

所属->テーブル名

affiliations_organization_id_fkey->制約名

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