名前を知っているだけでPostgresqlに制約名をドロップするにはどうすればよいですか?サードパーティのスクリプトによって自動生成される制約のリストがあります。テーブル名を知らずに制約名だけを削除する必要があります。
回答:
次のクエリを実行して、テーブル名を取得する必要があります。
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を含めることを忘れないでください。
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$$;
-右の外部キー制約を削除します
ALTER TABLE affiliations
DROP CONSTRAINT affiliations_organization_id_fkey;
注意:
所属->テーブル名
affiliations_organization_id_fkey->制約名