![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_08.png?08b1c8b)
あるプロジェクトで
OracleにアクセスするJavaのプログラムを書いています。
使用しているテーブル定義は、
主キーでも何でもない項目ほぼ全てにNotNull制約が付いています。
別にNotNull制約を除けば主キー以外の制約は何もありません。
これからつく予定もありません。
そこでふと、
各項目の入力値は全てプログラム側でチェックしていますので
プライマリキーや共通のフッタ部分(登録日、登録ProgramIDなど)を除けば
Not Null制約は全くいらないんじゃないかと思いました。
このような場合、NotNull制約は何の為についているんでしょうか?
No.5ベストアンサー
- 回答日時:
> もうちょっと正規化して、別テーブルにしてもらえませんか?とお願いもしましたが、
> もう決まっているから駄目と言われました。
> それで一体どうすればいいのかわからなくなって、
> 全項目NotNullを外せばいいんじゃないか?と思って質問してしまいました。
>
> こういう場合、どういう対処が望ましいのでしょうか?
正規化できるのであれば正規化するに越したことはないですが、できないのであれば仕方がないでしょう。
NOT NULL 制約の有無はソート列として指定された列以外ではあまり影響を与えることはありません。ましてや、WHERE 句の条件にもならないような列ではなおさらのことです。
ただ、NOT NULL 制約を好き勝手に外す権利があるのであれば、好き勝手に正規化する権利が jack_s さんにあるような気がしなくもないですが・・・。
DB管理者にDB変更依頼を提出し、
無事NotNull制約を外す事ができました。
正規化してくれないのは
汎用機出身の方だからでしょうか?
でも無事解決できてなによりです。
みなさまのアドバイスのおかげで助かりました。
ありがとうございました。
No.4
- 回答日時:
たとえばVB6.0やAccessのVBAのように、
NULLがあるといちいちIsNull関数を使用して処理分岐を行う必要がある
プログラミング言語を使用する可能性があれば、そういう設計にする
のもアリだと思います。
今はもう少数派かもしれませんが、
NULLという概念が薄かった汎用機のネットワーク型DBの名残で、
そういう設計をされる方も以前は多かったか。
#要するに設計がRDBでないという:-)
No.3
- 回答日時:
自分側で初期値も入れられない、さらに正規化も不可ということでしたら、
選択としては、
・NOT NULL制約をはずす
・自分の処理の部分を行わせる前に、サブシステム側でレコードが初期化されていることを保証してもらう
このくらいじゃないでしょうか。
ダメというなら解決策を説得するしかないでしょうね。
No.2
- 回答日時:
プログラムのバグ等により、データに間違って NULL が入ってしまわないようにするためです。
そして、最大の目的はデータとプログラムを切り離すためです。(DOA の概念。データベース内のデータは単独で意味を持つ。そもそも、データベースとは単にデータを入れる箱ではない)
一意制約やチェック制約、参照制約についても同様です。
特に、Oracle の場合は制約の有無によって実行計画が変わる場合があるので、そういう意味でも意味があると思います。例えば、ORDER BY 句で指定された列に索引が張られている場合、NOT NULL 制約がなければソート処理が行われますが、NOT NULL 制約があれば索引が使用できるためソート処理は発生しない可能性があります。(NULL のデータが索引にはないため。NOT NULL 制約がないと Oracle は ORDER BY でのソートに索引が使えることを理解できない)
この回答への補足
回答ありがとうございます。
データとプログラムを切り離すという
概念はわかりました。
今回なぜこういう質問をしてしまったかと言いますと、
ユーザからいただいたテーブルファイル定義では、
関連がないだろう?という項目が色々1つのテーブルに定義されていて、
その項目ほぼ全てにNotNull設定されていたからです。
そのテーブルに対するレコードは、私が作成する画面で登録します。
ウィザード形式のような画面でしたら
セッション上に蓄積したデータを最後に一気に書き込むという事ができます。
ですが今回のケースではこちらの作業範囲ではない
別のサブシステムから更新される項目で、
私が作成する画面では初期値を設定できないのです。
仮にフラグ類や金額だけでしたら
『0』を初期値とさせてもらうことで対応できるかとも思ったのですが、
それ以外の各種コード類にまでNotNull制約が張られている始末です。
もうちょっと正規化して、別テーブルにしてもらえませんか?とお願いもしましたが、
もう決まっているから駄目と言われました。
それで一体どうすればいいのかわからなくなって、
全項目NotNullを外せばいいんじゃないか?と思って質問してしまいました。
こういう場合、どういう対処が望ましいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- 法学 次の職業の自由の制約に対する説明のうち、薬局距離制限に対する最高裁判所の判決に照らして、明らかに適当 1 2022/11/25 13:35
- 憲法・法令通則 次の職業の自由の制約に対する説明のうち、薬局距離制限に対する最高裁判所の判決に照らして、明らかに適当 1 2022/11/27 09:22
- 不動産業・賃貸業 賃貸契約契約の解除 1 2022/11/07 18:02
- 借地・借家 簡易裁判所の退去費用の裁判の答弁書について 1 2023/03/07 19:33
- 法学 会社法166条 但し書きについて 5 2022/12/10 07:01
- 政治 個人的に、憲法改正案を考えてみました。 意見を聞かせてください。 特に、9条(第2章 - 戦争の放棄 3 2023/02/22 22:08
- その他(保険) 火災保険は自分で保険会社を選べるのか?変えたらトラブルになるのか? 4 2023/02/01 16:08
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の民法についての質問になります。 代理での問題で分からない事があります。 問 建物を購 2 2023/05/18 22:06
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
アナライズとインデックス作成...
-
文字列中のスペースを排除する...
-
オプティマイザはどちらのモー...
-
SQL*Loaderで、データを加工し...
-
SQL*LoaderとInsertの違いについて
-
可変個数のデータはどう納める?
-
索引の再構築をすべき?
-
データ表示順序
-
Oracle Databaseのインデックス...
-
インデックス作成後アナライズ...
-
SQLの処理速度改善にむけて
-
データを削除しても表領域の使...
-
異なるスキーマからデータを抽...
-
ORA-00959: 表領域'****'は...
-
CLOB型へのINSERT
-
postgreSQLのint型は桁数指定が...
-
ACCESS 複数テーブル・複数フィ...
-
カラムの存在チェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
SQL*Loaderで、データを加工し...
-
INDEXの無効化
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
文字列中のスペースを排除する...
-
論理読み込みブロック数とは?
-
インデックスの作成
-
OracleTextの索引再構築について
-
オラクル クラサバ環境で動作...
-
インデックス作成後アナライズ...
-
データ表示順序
-
Oracleのあいまい検索について
-
主キー以外の項目にNotNull制約...
-
IN 句ではインデックスが使用さ...
-
Oracle Databaseのインデックス...
-
索引の再構築をすべき?
-
SQLの処理速度改善にむけて
-
blevel=3のデータ作成
おすすめ情報