■SI Object Browser 掲示板


ユーザの皆様、開発者、サポート担当者の交流のための掲示板です!

ユーザーの皆様同士で教え合ったりもできる交流の場にしたいと思っていますので、相互協力をよろしくお願いします。
なお、過去に同じようなQ&Aがあるケースも多いので、投稿前にキーワード検索してみてください。

discussion
※各投稿のカラーは対象となる製品に対応しています。【■…OB ■…OBER ■…全般 ■…その他】
※ライセンスに関するお問合せにつきましては、お問い合わせページよりご連絡いただきますようお願いいたします。
※誹謗中傷や公序良俗に反する書き込みはご遠慮ください。運営側の判断によりメッセージを削除する場合があります。
※環境依存や技術的調査が必要な問題については掲示板上ではお答えしかねます。ご了承ください。
プライマリKey制約以外に同等の意味のCheck制約が作成される 2004/11/01 11:18 OB 2
Object Browser愛用者です。

クリエイトしたテーブルをObject Browser で参照すると、ソースタブに表示されるSQL文の主Key項目宣言部分にNot Nullが追記されてしまいます。
----例---------
CREATE TABLE XXXXXX
(
AAAAA VARCHAR2(6) NOT NULL,
BBBBB VARCHAR2(4) NOT NULL,
CCCCC DATE,
CONSTRAINT XXXXXX_PK PRIMARY KEY (AAAAA, BBBBB)
)
---------------
このままコンパイルすると、CONSTRAINTに不要なCheck制約が作成されてしまいます。プライマリ制約でNotNullの役割を果たしていると思うのですが。これってみなさんどうしてるんでしょうか・・・? 後からCheck制約を消すんでしょうか? それともプライマリKeyにNot Nullが追記されないような技があるのでしょうか?
アドバイスのほどよろしくお願いします。

[wakaba]
>このままコンパイルすると、CONSTRAINTに不要なCheck制約が作成されてしまいます。
>プライマリ制約でNotNullの役割を果たしていると思うのですが。

勘違いされていると思いますよ。

ObjectBrowserの利用に関係なく、そもそもOracleの仕様なのですが..
ご存じかとは思いますが、プライマリーキーは、NotNull&UniqueKeyです。

これは、オラクルの実装上、NotNull部分は、NotNull制約に統合されます。
UniqueKeyは、索引に統合されます。
そして、既に同じ内容の制約や索引が存在する場合は、プライマリー制約のための
NotNull制約や索引を新たに作成するのでなく、既存のNotNull制約や索引を兼用し
合理化します。

なので、無駄に制約や索引が作られるのでなく、実装上、そのような管理をしていると
考えるのが適切かと思います。
ありがとうございます。とても納得致しました。m(__)m

私の疑問を整理します。
管理しているテーブルクリエイト文では、プライマリ宣言する項目にわざわざNOT NULL という記述はしていないので、テーブル作成後のCONSTRAINTフォルダにできる制約は、スクリプトで制約名ごと宣言した~_PK というものだけです。ところが、開発メンバが個々の環境でテーブルを作り直す場合にOBのTABLEウィンドウ・ソースタブからリコンパイルする方が多く、そうすると個々の環境のCONSTRAINTに~_PK以外にSYSから始まるNOT NULl制約が一緒に追加されてしまいます。管理上の混乱やらスピードへの影響が気になっていました。それでOBのソースタブでプライマリのところにはNOT NULLを記述しないような設定がないか? という発想に転がったわけですが、そもそも管理の問題ですね。また、同等の意味の制約や索引があった場合、ORACLEで合理化するとの貴重な情報を頂いて、さらに納得しました。(この点は自己責任でもう少し調査します。余裕があったら^^;)

貴重なアドバイス、心から感謝します。ありがとうございました。