2

PostgreSQL システムに依存するデータベースがあり、それを維持しているので、テーブルと全体的なスキームを変更したいと考えています。このため、古いテーブルの名前を変更して、接頭辞としてアンダースコアを付けることを考えました。しかし、これは機能していません:

DROP TABLE IF EXISTS _my_table; -- table does not exists, this does nothing

ALTER TABLE my_table
  RENAME TO _my_table;

クエリの結果は次のとおりです。

注意: テーブル "_my_table" は存在しません。スキップします エラー:
タイプ "_my_table" は既に存在します
********** エラー **********

エラー: タイプ "_my_table" は既に存在します SQL 状態: 42710

「_my_table」テーブルは偽名ですが、実際に「_my_table」テーブルを作成して上記の同じスクリプトを実行すると、このエラーが再現されます。

pgAdmin III を使用してデータベース テーブルにアクセスしていますが、その「名前の変更」操作を使用すると、同じエラーが発生します。テーブル変更メソッドの postgresql ドキュメントでは、この特定の問題について明示的に説明されていません: http://www.postgresql.org/docs/9.3/static/sql-altertable.html

'_' の代わりに' backup ' のようなプレフィックスを使用する必要は本当にありますか? または、名前を変更することは可能でしょうか。私の唯一の関心は、テーブル名の変更を最小限に抑えながら、テーブル内の情報を維持することです。

4

2 に答える 2

5

すべてのテーブルには関連付けられたタイプがあるため、既存のテーブル名の前にアンダースコアを単純に配置することはできません...テーブル名の前にアンダースコアが付きます。pg_catalog.pg_typeこれは表で確認できます。テーブル名がアンダースコアで始まることは問題ではありませんが、内部手順では、新しいテーブルが古いテーブルから物理的に作成され、古いテーブルが他のプロセスによって使用されなくなった場合にのみ、古いテーブルが作成されます。関連付けられたタイプ、削除されます。したがって、タイプを参照するエラー(リレーションではありません)。

したがって、古い名前をアンダースコアで保持したい場合は、最初ALTER TABLEに一時的な名前に変更し、次にALTER TABLEアンダースコアと元の名前に変更する必要があります。または、単に別の接頭辞を使用してください...

于 2014-10-29T14:02:57.773 に答える
1

エラー:タイプ"_my_table" は既に存在します

テーブルと型の両方が内部テーブル pg_class に格納されます。一意の名前が必要です。そのため、このエラー メッセージが表示されます。

于 2014-10-29T14:03:18.780 に答える