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


PostgreSQL あとからテーブルにPrimary Key を付与するには。

PostgreSQL の マニュアル ALTER TABLE

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);

ALTER TABLE "テーブル名" ADD PRIMARY KEY ( "カラム名" )


さっそく 試してみることにする。
テーブルの確認
 ALTER TABLE ONLY a_test5 ADD PRIMARY KEY (a1);
ERROR:  Existing attribute "a1" cannot be a PRIMARY KEY because it is not marked NOT NULL
 ありゃ! 動作しないね。
 ERROR になる?!

NULL でないから みたいなメッセージです。 それなら NULL にすればいいのかな?
ええ NOT NULL にするには

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;

というのがあるのでこれを実行してみる。

ALTER TABLE a_test5 ALTER COLUMN a1 SET NOT NULL;
ERROR:  parser: parse error at or near "NOT"

 これもダメだぁ  なんでだろう?
 
別に新しく a_test7 を作って やって見る。
a_test7 で試してみる
create table a_test7 (a1 char(10), a2 char(10) );
CREATE
beniya=# select \d a_test7;
          Table "a_test7"
 Column |     Type      | Modifiers
--------+---------------+-----------
 a1     | character(10) |
 a2     | character(10) |

beniya-# ALTER TABLE a_test7 add primary Key (a1);
ERROR:  parser: parse error at or near "TABLE"
beniya=# ALTER TABLE a_test7 add primary Key (a1);
ERROR:  Existing attribute "a1" cannot be a PRIMARY KEY because it is not marked NOT NULL
beniya=# alter table a_test7 alter column a1 set not null;
ERROR:  parser: parse error at or near "not"
beniya=# alter table a_test7 alter column a1 set not null;
ERROR:  parser: parse error at or near "not"

   ほよ!! やはり出来ない。
   これはこのVersion では出来ないの?

   単に何処か間違っているのかな?


なんでだろう? 書籍 オライリージャパン 実践PostgreSQL ISBN4-87311-102-1 を調べてみても 同じ。ことを書いている。
Version は PostgreSQL 7.2 系でいける筈。

わからない!! 

普通に CEREATE TABLE テーブル名 ( a1 char(10) PRIMARY KEY ・・・・・ ) とか、は ちゃんと Primary Key が作られている。
su になっても同じようです。

suである postgres でやっても同じ
ALTER TABLE a_test5 ADD Primary Key (a1);
ERROR:  Existing attribute "a1" cannot be a PRIMARY KEY because it is not marked NOT NULL



ALTER TABLE a_test6 ADD CONSTRAINT a_test6_pkey UNIQUE (a1); こんな風にすると これでいいのかな?
\di
       List of relations
     Name     | Type  | Owner
--------------+-------+--------
 ByOrderNo    | index | beniya
 PartNo       | index | beniya
 a_test3_pkey | index | beniya
 a_test4_pkey | index | beniya
 a_test6_pkey | index | beniya

  これでもいいのかな?

  一応 index は付いたようですけど・・・・

しかし まだ NOT NULL はついていない。
 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 |
Unique keys: a_test6_pkey

  • むむむ・・・・ Not NULL はついてないね。

クライアント側からみると
  • 見た目には
    a_test4_pkey と a_test6_pkey は同じように見える。



この Version の PostgreSQL では こんなことをする意味がない。 結局のところ テーブル構造を変えようとすると
この方法 で変えざるを得ないのだから、後から Primary Key を設定出来たとしてもあまり意味がないことになる。




目次に戻る

Last Update 2006/06/02  14:40 JST

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