../../image/benilogo.gifPostgreSQL について


PostgreSQL のテーブルの列のデーター型を変えるには。

現在使っている version 7.2.1 では出来ない。 と言うか 一発では出来ないらしい。

PostgreSQL の 8.01 のマニュアルには 列のデータ型の変更 と説明があるが それ以前のもの 例えば Version 7.3.2
や 7.2 系 には そのようなことは書いていない。

列を異なるデータ型に変換するには以下のようなコマンドを使用してください。 

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

  • これは 8.01 のマニュアルより


マニュアルに載っていないので、出来ないとは思うけど、念のため実行してみることにする。
さっそく 試してみることにする。
データー型の変更
beniya=# ALTER TABLE bhnmst_test1 ALTER COLUMN bhn_kousu TYPE numeric(5,2);
ERROR:  parser: parse error at or near "TYPE"
beniya=# ALTER TABLE bhnmst_test1 ALTER  bhn_kousu TYPE numeric(5,2);
ERROR:  parser: parse error at or near "TYPE"
beniya=# ALTER TABLE bhnmst_test1 ALTER  bhn_kousu type numeric(5,2);
ERROR:  parser: parse error at or near "type"
b
   これではダメですね。
   

   



しかし、 列のデーター型を変更するのはよくあることで、別に一発で出来なくてもいいし、何段階かで出来ればいい。
さて、どうやればいいのかな?

実験 
例えば bhn_kousu Numeric ( 3,2 ) を bhn_kousu numeric ( 5,2 ) に変えたい場合
手順 参考 SQL文
1 まず 元データー を 退避する。  テーブルのコピー CREATE TABLE bhnmst_test1 AS SELECT * FROM bhnmst;
2 変更する column 名 を変える  Column名の変更 ALTER TABLE bhnmst RENAME bhn_kousu TO bhn_kousu_1;
3 新columnを追加する。 Columnの追加 ALTER TABLE bhnmst ADD bhn_kousu numeric(5,2);
4 旧データーを新Column にコピー UPDATE 文 UPDATE bhnmst SET bhn_kousu = bhn_kousu_1;
5 旧column を削除する。 参考スレッド このバージョンでは出来ないのか?

なんとまぁ 参考スレッド のなかでいろいろ議論されているように 列の削除は出来ないらしい。
現在使用している バージョン ではマニュアルにも記載されていない。 
しかし、新バージョン PostgreSQL7.3 系 7.4系 8.01系  とかは削除が載っている。 

そうすると、このバージョンでそもそもの列の定義を変更しようとすれば、これは個々定義しても旧の列が削除できないので
最初から作り直したほうがよさそうです。 コピー(退避)しておき、最初に作った SQL文 を手直しして 新規テーブルを登録する。
そして 退避していたデーターを復元する。  しかし昔々の COBOL の ISAM File のFileメンテナンスと同じだね!!
とまぁ こんなことで出来るかな?

実験の2
テストで簡単に作るテーブルは別として 本番用のテーブル構造はそう簡単なものではないので sql 文として保存しておく。
/****************************************
**    テスト用の簡単テーブルを作る。
**
**
*****************************************/
DROP TABLE a_attr1;
CREATE TABLE a_attr1 (
     a1  char(10)  Primary Key,
     a2  varchar,
     a3  numeric(3,2)    --後で変更予定
);
  • これに a_attr1.sql と名前を付けて保存する。
テーブルの作成
beniya-# \i a_attr1.sql
psql:a_attr1.sql:6: ERROR:  table "a_attr1" does not exist
psql:a_attr1.sql:11: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'a_attr1_pkey' for table 'a_attr1'
CREATE

データーを挿入し確認する。
INSERT INTO a_attr1 values( 'abe','sssssss',0.26);
INSERT 22426 1
beniya=# select * from a_attr1;
     a1     |    a2    |  a3
------------+----------+------
 abc        | なんたら | 1.02
 abd        | こうした | 0.23
 abe        | sssssss  | 0.26
(3 rows)

  • 一応、こんなテーブルが出来た。

さて、問題はここから

手順 参照
1. テーブルの名前を変える ALTER TABLE RENAME ALTER TABLE a_attr1 RENAME TO a_ttr1_OLD;
2. INDEX の削除 DROP INDEX DROP INDEX a_attr1_pkey;
3. テーブル構造を変える a_attr1.sql を変える a3 numeric(3,2) -> a3 numeric(5,2) に修正する。
4. 新規テーブルを作る。 \i a_attr1.sql を参照 \i a_attr1.sql
5. 退避先から復元 INSERT INTO INSERT INTO a_attr1 SELECT * FROM a_ttr1_OLD;
6. 確認 内容確認 データーの確認
7. 退避テーブルを削除する。 DROP TABLE

確認
 select * from a_attr1;
     a1     |    a2    |  a3
------------+----------+------
 abc        | なんたら | 1.02
 abd        | こうした | 0.23
 abe        | sssssss  | 0.26
(3 rows)

beniya=# select \d a_attr1;
            Table "a_attr1"
 Column |       Type        | Modifiers
--------+-------------------+-----------
 a1     | character(10)     | not null
 a2     | character varying |
 a3     | numeric(5,2)      |
Primary key: a_attr1_pkey


  • これで 列の構造を変えることが出来る。



まぁ こんなところでしょうか?......
しかし、少々 面倒くさいなぁ 最新版にするべきでしょうかねぇ・・・・.







目次に戻る

Last Update 2005/02/06  01:46 JST

(C) Y.Kondou,2005 All Rights, Reserved.
e-mail:kondou@beniya.com