1. ホーム
  2. sql

[解決済み] Postgresでpublicから他のスキーマにテーブルを移動する方法

2023-04-05 17:17:59

質問

Postgres 9.1データベースはpublicスキーマにyksus1 ... ykssu9テーブルを含んでいます。pgAdminは以下のコードのようにそれらの定義を表示しています。 これらのテーブルをfirma1スキーマに移動するにはどうしたらよいでしょうか?

firma1スキーマの他のテーブルは、これらのテーブルの主キーに対する外部キー参照を持っています。これらのテーブルへの外部キー参照は、Firma1スキーマのテーブルからのみです。

これらのテーブルの中には、データを含んでいるものがあります。 テーブルをfirma1スキーマに移動した場合、外部キー参照もfirma1.yksusnのテーブルに更新される必要があります。 テーブルの構造を変更することはできません。

主キー配列はすでにfirma1スキーマにあるようなので、それらは移動されないはずです。 バージョン文字列 PostgreSQL 9.1.2 x86_64-unknown-linux-gnu, コンパイル: gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit

CREATE TABLE yksus1
(
  yksus character(10) NOT NULL DEFAULT ((nextval('firma1.yksus1_yksus_seq'::regclass))::text || '_'::text),
  veebis ebool,
  nimetus character(70),
  "timestamp" character(14) DEFAULT to_char(now(), 'YYYYMMDDHH24MISS'::text),
  username character(10) DEFAULT "current_user"(),
  klient character(40),
  superinden character(20),
  telefon character(10),
  aadress character(50),
  tlnr character(15),
  rus character(60),
  CONSTRAINT yksus1_pkey PRIMARY KEY (yksus)
);
ALTER TABLE yksus1
  OWNER TO mydb_owner;

CREATE TRIGGER yksus1_trig
  BEFORE INSERT OR UPDATE OR DELETE
  ON yksus1
  FOR EACH STATEMENT
  EXECUTE PROCEDURE setlastchange();

他のテーブルも同様です。

CREATE TABLE yksus2
(
  yksus character(10) NOT NULL DEFAULT ((nextval('firma1.yksus2_yksus_seq'::regclass))::text || '_'::text),
  nimetus character(70),
  "timestamp" character(14) DEFAULT to_char(now(), 'YYYYMMDDHH24MISS'::text),
  osakond character(10),
  username character(10) DEFAULT "current_user"(),
  klient character(40),
  superinden character(20),
  telefon character(10),
  aadress character(50),
  tlnr character(15),
  rus character(60),
  CONSTRAINT yksus2_pkey PRIMARY KEY (yksus),
  CONSTRAINT yksus2_osakond_fkey FOREIGN KEY (osakond)
      REFERENCES yksus2 (yksus) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
);
ALTER TABLE yksus2
  OWNER TO mydb_owner;

CREATE TRIGGER yksus2_trig
  BEFORE INSERT OR UPDATE OR DELETE
  ON yksus2
  FOR EACH STATEMENT
  EXECUTE PROCEDURE setlastchange();

どのように解決するのですか?

ALTER TABLE yksus1
    SET SCHEMA firma1;

詳しくはマニュアルをご覧ください。 http://www.postgresql.org/docs/current/static/sql-altertable.html

<ブロッククオート

テーブルのカラムが所有する関連インデックス、制約、シーケンスも同様に移動されます。

トリガ関数についてはよく分かりませんが、同等な ALTER FUNCTION .. SET SCHEMA ... もあります。