私は以下を試しましたが、失敗しました:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
私は以下を試しましたが、失敗しました:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
回答:
「アルター列位置 PostgreSQLのWikiの中には、」言います:
PostgreSQLは現在
attnum
、pg_attribute
テーブルの列に基づいて列の順序を定義しています。列の順序を変更する唯一の方法は、テーブルを再作成するか、目的のレイアウトに到達するまで列を追加してデータをローテーションすることです。
それはかなり弱いですが、防御として、標準SQLでは、列を再配置するためのソリューションもありません。列の順序位置の変更をサポートするデータベースブランドは、SQL構文の拡張を定義しています。
もう1つのアイデアが思い浮かびVIEW
ます。基本テーブルでの列の物理的な位置を変更せずに、列の順序を好きなように指定するを定義できます。
PostgreSQLでは、フィールドを追加するときに、テーブルの最後に追加されます。特定の位置に挿入する必要がある場合
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
この投稿は古く、おそらく解決されましたが、同じ問題がありました。新しい列の順序を指定して、元のテーブルのビューを作成することで解決しました。
ここから、ビューを使用するか、ビューから新しいテーブルを作成できます。
CREATE VIEW original_tab_vw AS SELECT a.col1、a.col3、a.col4、a.col2 FROM original_tab a WHERE a.col1 IS NOT NULL-または何でも
SELECT * INTO new_table FROM original_tab_vw
元のテーブルの名前を変更または削除し、新しいテーブルの名前を古いテーブルに設定します。
1つは、列の順序を完全に変更する必要があり、外部キーが使用されている場合に列を再配置する不格好なオプションですが、最初にデータベース全体をデータでダンプし、次にスキーマのみをダンプすることです(pg_dump -s databasename > databasename_schema.sql
)。次に、スキーマファイルを編集して、必要に応じて列を再配置し、スキーマからデータベースを再作成して、最後に、新しく作成したデータベースにデータを復元します。
現時点ではできないと思います。Postgresqlwikiのこの記事を参照してください。
この記事の3つの回避策は次のとおりです。
PGAdminでテーブルを開き、下部のSQLペインでSQL Create Tableステートメントをコピーします。次に、クエリツールを開いて貼り付けます。テーブルにデータがある場合は、テーブル名を「new_name」に変更します。ない場合は、ドロップテーブル行のコメント「-」を削除します。必要に応じて列シーケンスを編集します。移動した場合に備えて、最後の列の欠落/余分なコンマに注意してください。新しいSQL Create Tableコマンドを実行します。リフレッシュして...ボイラ。
設計段階の空のテーブルの場合、この方法は非常に実用的です。
テーブルにデータがある場合、データの列シーケンスも再配置する必要があります。これは簡単です。次のコマンドを使用INSERT
して、古いテーブルを新しいバージョンにインポートします。
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
...どこc2
、c3
、c1
列がありc1
、c2
、c3
彼らの新しい位置に古いテーブルの。この場合、編集した「古い」テーブルには「新しい」名前を使用する必要があります。そうしないと、データが失われます。列名が多い、長い、または複雑な場合は、上記と同じ方法を使用して新しいテーブル構造をテキストエディターにコピーし、INSERT
ステートメントにコピーする前にそこで新しい列リストを作成します。
すべてが正常でDROP
あることを確認した後、古いテーブルを使用して「新しい」名前を「古い」に変更するALTER TABLE new RENAME TO old;
と、完了です。
私は多くのテーブルの並べ替えに取り組んでおり、同じクエリを何度も作成する必要がなかったので、それをすべて行うスクリプトを作成しました。基本的に、それは:
pg_dump
pg_dump
クエリを変更して、データを含む並べ替えられたテーブルを作成します次の簡単なコマンドを実行して使用できます。
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
それはあなたがそれを検証してテストできるようにSQLを出力します、それが私がそれに基づいた大きな理由でしたpg_dump
。あなたは見つけることができるここにgithubのレポを。
私はDjangoを使用していますが、頭痛がしたくない場合は、各テーブルにid列が必要です。残念ながら、私は不注意で、自分のテーブルbp.geo_location_vagueにこのフィールドが含まれていませんでした。私は少しトリックを始めました。ステップ1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
ステップ2:(テーブルを作成しない-テーブルは自動的に作成されます!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
ステップ3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
テーブルにbigserial疑似タイプが必要だからです。SELECT *の後にpgを実行すると、bigint型のinsetad bigserialが作成されます。
ステップ4:これで、ビューをドロップし、ソーステーブルをドロップして、新しいテーブルの名前を古い名前に変更できます。トリックは無事終了しました。
それを可能にするいくつかの回避策があります:
テーブル全体を再作成する
現在のテーブル内に新しい列を作成する
ビューを作成する