2008年2月14日

[pgsql-jp: 39200] RE: 主キーのINDEXの削除の仕方


忠犬KEN公です。

主キーの制約を定義する背景で、重複チェックをするためにインデクスが
作成されています。
したがって、主キーの変更は「制約の削除」と「制約の追加」をすることに
なります。

(1)制約の削除

alter table 表名
drop constraint 制約名

(2)制約の追加・・・主キーの場合

alter table 表名
add primary key(列名1,列名2)


制約名は、情報スキーマを検索すれば分かります。

select *
from information_schema.constraint_column_usage
where table_name='t_example';
select *
from information_schema.constraint_table_usage
where table_name='t_example';

主キーの制約名は、「表名_pkey」のようです。

これらを踏まえてalter table文を書くと、

alter table t_example
drop constraint t_example_pkey

alter table t_example
add primary key(key1,key2)

という指定になると思います。


> Subject: [pgsql-jp: 39199] 主キーのINDEXの削除の仕方
>
> 度々お世話になります、もりもとです
>
> もしかするとものすごく初歩的なこととか、
> FAQかもと、思うのですが・・・
>
> PostgreSQL 8.2.4を使っていまして、
> 元々、このようなテーブル(T_EXAMPLE)があって、
> key1がPRIMARY KEYとなっていました。
>
> Column | Type | Modifiers
> --------+-----------------------------+---------------
> key1 | character varying(15) | not null
> data | character varying(50) |
>
> しばらく運用してデータが溜まった後、仕様変更でフィールドを追加し、
> 運用しながら、主キーをKEY1とKEY2の複合キーとすることにしました。
>
> Column | Type | Modifiers
> --------+-----------------------------+---------------
> key1 | character varying(15) | not null
> key2 | character varying(4) | not null
> data | character varying(50) |
>
> ここで、元々のCREATE TABLEで自動的に作られたKEY1のためのインデックス、
> T_EXAMPLE_PKEYを削除して、
> 新しくKEY1とKEY2の複合キーのインデックスを設定したいのですが・・・
> T_EXAMPLE_PKEYの削除の仕方がわかりません。。
>
> 単純に
>   DROP INDEX T_EXAMPLE_PKEY;
> では、T_EXAMPLEの制約で使われているからドロップできない、
> とエラーになってしまいますし・・・
>
> では、T_EXAMPLEの制約を外そうと思っても
>   ALTER TABLE T_EXAMPLE ALTER COLUMN KEY1 DROP NOT NULL;
> KEY1は主キーですよ、とエラーになってしまいます。。
>
> 運用しながらの改造のため、
> テーブルの作り直し、データの入れ直しは避けたいのですが・・・
> どうやるのが正しいのでしょうか?
>
> - YAMANEKO / Mao
> http://yamamaya.com/
>

_________________________________________________________________
「脳内メーカー」の次は「鞄の中身メーカー」? Live Search で検索!
http://search.msn.co.jp/results.aspx?q=%E9%9E%84%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC&FORM=MGCEAA

投稿者 xml-rpc : 2008年2月14日 12:01
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69734
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。