2011年3月24日木曜日

Oracle-主キーに後から項目を追加する

最初から主キーを定義する場合は問題ないのですが、仕様変更が発生して主キーの変更が必要になった場合についつい忘れがちなのがこのコマンドです。(主キーの変更が必要になる仕様変更は初期の段階でないかぎりめったに発生するものではないので...)

主キー Create文
CREATE TABLE テーブル名
(項目名 属性,
項目名 属性,
…,
〔CONSTRAINT 主キー名〕 PRIMARY KEY (項目名, 項目名, …)
);
CREATE TABLE テーブル名
(項目名 属性 〔CONSTRAINT 主キー名〕 PRIMARY KEY, --この方法は、主キーが一項目だけの場合のみ使用可能
項目名 属性,

);
主ーに後から項目を追加
■まず、主キー制約を削除する。
ALTER TABLE テーブル名 DROP PRIMARY KEY;

■主キー制約を追加する。
ALTER TABLE テーブル名 ADD 〔CONSTRAINT 主キー名〕
PRIMARY KEY(項目名, 項目名, …)
;

2011年3月21日月曜日

Oracle Database キャラクタセットについて

新規DB作成時の注意事項

ふと忘れてしまうのが、キャラクタセットのコード設定。11gのインストールがうまく終了しない ことに気をとられてしまい、キャラクタセットのコード設定でつまずく。
 Oracle11gのキャラクタセットは、無指定だと「AL32UTF8」で作成されます。 ここで注意が必要なのが JA16SJIS で作成されたDBを移行する場合です。

Oracleで許可されているデータベースオブジェクト名のサイズはマニュアルに記載されているように、データベース名とデータベースリンク名を除いて 30バイトまでとなっています。

JA16SJIS → AL32UTF8
  • ディスク容量の見直。
  • JA16SJIS2バイトであった文字がAL32UTF8では3バイトになる。

JA16SJISのデータベースで表示名や列名を日本語(マルチバイト)11文字以上で定義していた場合、キャラクタセットが AL32UTF8 であるデータベースではDDLすべてがエラーになる。
 それらを修正するとなるとSQL/DDL文・その他プログラムに至るまで、その影響は広範囲に渡ります。

DBをインストールする機会がたびたびある訳ではないので、以外に上記のことを忘れがちです。 JA16SJISで日本語で15文字以内で項目名や表名を定義しているとAL32UTF8では、10文字以内にすることが必要になり、日本語10文字ですべてをうまく表現するのはなかなか難しいものです。

いずれAL32UTF8にしようと考えている場合は、修正コストは掛かりますが日本語名から英数字名に変更するか、日本語項目名を10文字以内にして修正を行っておくことを薦めます。