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


PostgreSQL のテーブルを別のテーブルにコピーするには。

まずは、ざっと マニュアルを眺めると Copy と言うのが目につくが、これは テーブルとファイル間のコピー なので違うようです。
次に CREATE TABLE AS ってのが クエリーから新しいテーブル を作るとある。


CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ]
AS query


CRETE TABLE "新テーブル名" as Query だから 


さっそく 試してみることにする。
テーブルの確認
beniya=# CREATE TABLE a_test5 as SELECT * FROM a_test4;
SELECT
beniya=# select * from a_test5;
     a1     |      a2       |           a3           |           a4
------------+---------------+------------------------+------------------------
 123        | gLOG          | 2005-01-27 11:26:26+09 | 2005-01-24 15:00:48+09
 bcom       | dsaaaagggg    | 2005-01-24 18:23:57+09 | 2005-01-24 18:24:00+09
 ddkey      | fsdffffff     | 2005-10-11 00:00:00+09 | 2005-10-12 00:00:00+09
 eee        | esa           | 2005-01-26 13:03:13+09 | 2005-01-26 13:01:25+09
 aaa        | こいつ        | 2005-01-26 14:31:05+09 | 2005-01-24 00:01:01+09
 aaaaa      | jokeです。    | 2005-01-26 14:31:20+09 | 2005-01-24 14:24:17+09
 aaaab      | duog          | 2005-01-26 14:31:26+09 | 2005-01-24 14:24:45+09
(7 rows)

   a_test4 から a_test5 テーブルを作る。
   
   


  
   内容を確認するとちゃんと出来ている。






しかし、 
テーブルの確認
select \d a_test4;
                Table "a_test4"
 Column |           Type           | Modifiers
--------+--------------------------+-----------
 a1     | character(10)            | not null
 a2     | character(10)            |
 a3     | timestamp with time zone | not null
 a4     | timestamp with time zone | not null
Primary key: a_test4_pkey

   a_test4 から a_test5 の二つを比較すると
    
   複写された方には制約はコピーされてはいないようです。   
   Primary Key とかもです。

  
   まぁ これはこのほうがいいのかも知れない。 
   必要になれば、ALTER TABLE で付ければいいか・・・・

   でも全部ひっくるめてコピーできたらいいのにね。
   なんか方法があるのかも知れない。

   知ってる人がいたら 教えて・・・ 


select \d a_test5;
                Table "a_test5"
 Column |           Type           | Modifiers
--------+--------------------------+-----------
 a1     | character(10)            |
 a2     | character(10)            |
 a3     | timestamp with time zone |
 a4     | timestamp with time zone |



同じく マニュアルに こんな方法もあった。

SELECT * INTO "新しいテーブル名" FROM "元テーブル名";

これも やって見る。
SELECT* INTO の確認
SELECT * INTO a_test6 FROM a_test4;
SELECT
beniya=# select * from a_test6;
     a1     |      a2       |           a3           |           a4
------------+---------------+------------------------+------------------------
 123        | gLOG          | 2005-01-27 11:26:26+09 | 2005-01-24 15:00:48+09
 bcom       | dsaaaagggg    | 2005-01-24 18:23:57+09 | 2005-01-24 18:24:00+09
 ddkey      | fsdffffff     | 2005-10-11 00:00:00+09 | 2005-10-12 00:00:00+09
 eee        | esa           | 2005-01-26 13:03:13+09 | 2005-01-26 13:01:25+09
 aaa        | こいつ        | 2005-01-26 14:31:05+09 | 2005-01-24 00:01:01+09
 aaaaa      | jokeです。    | 2005-01-26 14:31:20+09 | 2005-01-24 14:24:17+09
 aaaab      | duog          | 2005-01-26 14:31:26+09 | 2005-01-24 14:24:45+09
(7 rows)

beniya=# SELECT \d a_test6;
                Table "a_test6"
 Column |           Type           | Modifiers
--------+--------------------------+-----------
 a1     | character(10)            |
 a2     | character(10)            |
 a3     | timestamp with time zone |
 a4     | timestamp with time zone |

   a_test4 から a_test6 テーブルを作成する。
   
   


  
   これの結果は CREATE TABLE AS と同じです。






マニュアル注釈
Note: CREATE TABLE AS は機能的には SELECT INTO と同じです。 SELECT INTO は標準ではないので、構文は CREATE TABLE AS をお勧めします。実際、この SELECT INTO という形式は PL/pgSQL や ecpg では有効ではありません。なぜならそれらは INTO 句を異なって解釈するからです。


なるほど これは CREATE TABLE AS をつかった方がいいらしい。









目次に戻る

Last Update 2006/06/02  14:20 JST

(C) Y.Kondou,2005,2006 All Rights, Reserved.
その他、お気づきの点がありましたら連絡先はこちらから