web-dev-qa-db-ja.com

PostgreSQLの「REFERENCES」を変更するにはどうすればよいですか?

テーブル名が変更されたときに、PostgreSQLのテーブルへの参照を変更するにはどうすればよいですか?

私が持っていると言います:

CREATE TABLE example1 (
   id serial NOT NULL PRIMARY KEY,
   name varchar(100)
);

CREATE TABLE example2 (
   id serial NOT NULL PRIMARY KEY,
   example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED
);

後で私はします:

ALTER TABLE example1 RENAME TO example3; 

外部キー制約の定義を変更するにはどうすればよいですか?

example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED,
22

テーブルや他のオブジェクト間の内部依存関係がオブジェクト名にバインドされることはありません。内部的には、すべてのオブジェクトがカタログテーブルに格納され、オブジェクトのOID(内部主キー)がeverythingその他に使用されます。

したがって、FOREIGN KEY参照はカタログテーブル pg_constraint および pg_depend に格納されます。テーブル名を変更しても、機能がまったく損なわれません

制約のnameは変更されません。これを無視することも、誤解を招かないように制約の名前を変更することもできます。

ただし、作成時に制約名を指定しなかったため、名前が使用されない限り、システムはデフォルトのexample2_example1fk_fkeyを選択しました。参照されるtable名への参照はありません。ただし、列名も、例では変更する必要があります。そして、thatが制約名で使用されます。

ALTER TABLE example2 RENAME example1fk TO example3fk;  -- rename column

Postgres 9.2以降では、制約の名前も変更できます(コメント dequisがコメントされている と同様)。

ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey;

古いバージョンでは、制約を削除して再作成し、名前を変更する必要があります。

ALTER TABLE example2  -- rename constraint
   DROP CONSTRAINT example2_example1fk_fkey
 , ADD  CONSTRAINT example2_example3fk_fkey FOREIGN KEY (example3fk)
      REFERENCES example3 (id) DEFERRABLE INITIALLY DEFERRED;

マニュアルの詳細

26