0

PostgreSQL v7.4 データベースのテーブルの CHAR 列の長さを変更する必要があります。このバージョンでは、ALTER TABLE ステートメントを使用して列の型やサイズを直接変更する機能はサポートされていませんでした。したがって、たとえば列を CHAR(10) から CHAR(20) に直接変更することはできません (ええ、「varchars を使用する」ことはわかっていますが、現在の状況ではオプションではありません)。これを最もよく達成するためのアドバイスやコツはありますか?私の最初の考え:

-- テーブルのデータを新しい「保存」テーブルに保存します。CREATE TABLE save_data AS SELECT * FROM table_to_change;

-- 変更する最初の列から列を下にドロップします。ALTER TABLE table_to_change DROP column_name1; -- 変更が必要な最初の列から始まる各列に対して ALTER TABLE table_to_change DROP column_name2; ...

-- CHAR 列の新しいサイズを使用して、列を追加し直します。 ALTER TABLE table_to_change ADD column_name1 CHAR(new_size); -- ALTER TABLE table_to_change ADD column_name2 の上にドロップされた各列に対して...

-- 「保存」テーブルからデータベースをコピーします UPDATE table_to_change SET column_name1=save_data.column_name1, -- column_name2=save_date.column_name2 の上で削除/再追加された各列に対して、 ... FROM save_data WHERE table_to_change.primary_key=save_data.primay_key;

うん!うまくいけば、より良い方法がありますか?任意の提案をいただければ幸いです。ありがとう!

4

3 に答える 3

2

PostgreSQL ではありませんが、Oracle では次の方法で列の型を変更しました。

  1. TMP_COL一時的な名前 (例: ) と新しいデータ型 (例: )を持つ新しい列を追加しますCHAR(20)
  2. 更新クエリを実行します。UPDATE TBL SET TMP_COL = OLD_COL;
  3. 落とすOLD_COL
  4. TMP_COLに名前を変更OLD_COL
于 2009-11-30T20:20:01.373 に答える
1

あなたの問題への最善のアプローチは、pgを古風なものにアップグレードすることです:)

真剣に。7.4 は「サポートされているバージョン」からすぐに削除される予定です。

于 2009-11-30T20:33:29.427 に答える
1

COPY を使用してテーブルの内容をフラット ファイルにダンプし、テーブルを削除して、正しい列設定でテーブルを再作成し、(再度 COPY を使用して) リロードします。

http://www.postgresql.org/docs/7.4/static/sql-copy.html

この操作の実行中にダウンタイムが発生することは許容されますか? 明らかに、今説明したことでは、テーブルを一定期間使用できなくする必要があります。その時間は、使用しているデータ サイズとハードウェアによって異なります。

編集:しかし、COPYはINSERTやUPDATEよりもかなり高速です。docs によると、BINARYモードを使用するとさらに高速化できます。BINARY を使用すると、他の PGSQL インストールとの互換性が低くなりますが、ダンプしたのと同じインスタンスにデータをロードするだけなので、気にする必要はありません。

于 2009-11-30T19:59:33.550 に答える