8

いくつかの制約を削除して最後に復元する必要がある SQL スクリプトがありますが、制約名は自動生成され、スクリプトを実行するたびに異なります。

テーブル名から制約名を取得する方法は知っていますが、drop ステートメントでこの情報を使用することはできないようです。

select conname from pg_constraint where
   conrelid = (select oid from pg_class where relname='table name')
   and confrelid = (select oid from pg_class where relname='reference table');

alter table something drop constraint (some subquery)構文エラーです。

理想的には、制約名を取得して変数に格納したいのですが、Postgres がそれをサポートしていないようで、 psql で動作させることはできません\set

これは可能ですか?

4

2 に答える 2

9

外部キー制約を動的に削除して再作成するには、すべてを関数でラップするか、次のDOコマンドを使用できます。

DO
$body$
DECLARE
   _con text := (
      SELECT quote_ident(conname)
      FROM   pg_constraint
      WHERE  conrelid = 'myschema.mytable'::regclass
      AND    confrelid = 'myschema.myreftable'::regclass
      LIMIT 1 -- there could be multiple fk constraints. Deal with it ...
      );

BEGIN
   EXECUTE '
      ALTER TABLE wuchtel12.bet DROP CONSTRAINT ' || _con;

   -- do stuff here

   EXECUTE '
      ALTER TABLE myschema.mytable
      ADD CONSTRAINT ' || _con || ' FOREIGN KEY (col)
      REFERENCES myschema.myreftable (col)';
END
$body$

を使用するには、テーブルを所有している必要がありますALTER TABLE
それ以外の場合は、 (同じ本体を使用して)関数を作成し、LANGUAGE plpgsql SECURITY DEFINER

ALTER FUNCTION foo() OWNER TO postgres;

postgresここではスーパーユーザー、またはテーブルの所有者です。
ただし、セキュリティについてマニュアルに記載されている内容を必ず確認してください。

このマニュアルには、動的コマンドの詳細も記載されています。

于 2012-09-12T21:55:20.930 に答える