SQLの制約に関して、「Not Null制約は列レベルのみ」とあったのですが、なぜ表レベルで制約付けられないのでしょうか?列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。
自分で調べても以下のリンクのようなものしかなく、ちゃんとした理由が述べられているHPに辿り着けなかったので、こちらに質問させていただきました。
https://www.google.co.jp/amp/s/okwave.jp/amp/qa/q9363660.html
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
Not Null制約はカラムに対しての制約ですので、それをテーブルのオプション属性で可能にするみたいな話ですね。
もしそれをDBMSが実装するとしたら、実行時に参照するような作りではなく、Create時に各カラムにNot null制約を付加するような実装になるかと思われます。
ERツールにもそのような機能を持っているものは無いので、
列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。
というニーズがニッチなんだと思います。
若しくは、そういうのを楽だと思う人は自前でCreate文を生成するツールを作っているんでしょう。
実際、エクセルでのテーブル定義からCreate文を生成するものは良く見かけますし。
投稿2018/09/19 01:55
総合スコア25173
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/19 02:05
2018/09/19 02:12
2018/09/19 02:15
2018/09/24 23:11
0
列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。
表の定義はそんなに頻繁に行うものではありませんし、「表全体でNOT NULL
」という機能があったところで、できることは増えません。まさに、「いちいち全ての列にNot Null 制約を付ける」だけで済む話です。
投稿2018/09/19 00:30
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/24 03:12
0
単純に、すべての列を not null で定義したいことがほとんど無いからだと思います。
実際、私自身は今まで何百何千レベルでテーブル設計をしてきたと思いますが、一度もそのような機能が欲しいと思ったことはないですね。
すべての列が not nullであるテーブルももちろんあり得ますが、どちらかと言えばレアケースだと思います。
投稿2018/09/21 03:48
総合スコア1167
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/25 22:42
0
単に複数列の制約が必要ないからじゃないでしょうか
複数列の制約でなければ列制約で十分なので表制約は不要ですよね?
ColumnA INT UNIQUE, ColumnB INT UNIQUE
と
UNIQUE(ColumnA, ColumnB)
混同しているような気がします。
列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。
それは全列にNot Null制約を付与する構文があればいいだけなのではないでしょうか?
そしてその構文を求める人はそれほど多くないので構文が拡張されたりしていないのでしょう
投稿2018/09/19 10:35
総合スコア37
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/25 22:36
0
質問者さんはなんとなく大きな勘違いをしているように見受けられます
仮にnot nullだとしても""などデータが空であるかのようなデータは投入可能です
nullを弾くことは確かに重要ですが、nullを弾いたからといって
必須入力項目を確定させることにはなりません
投稿2018/09/19 04:56
総合スコア114775
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/24 23:14
0
ベストアンサー
私見ですが、
DBだけで運用するということはほとんどないわけで、
DBを利用する側の言語では必ずバリデーションを入れます。
DBの方だけNotNullにしておけばそれでOKということはなくて、
実際に言語側でも必須チェックなどは必要となります。
それも自動で行うことはできないわけで、フレームワークなどでも「この列は必須」という設定が必要になります。
確かに「表レベルでかけられれば楽」という考え方は分からないでもないですが、
NotNullとする列には必ずきちんとした理由があるわけで(他の制約もですが)、
その理由を1つ1つの列に意識して・意図して制約を入れなければならないという意味で、表レベルでの制約はかけられなくなっているのではないでしょうか。
「とりあえずNotNullにしとけばいいや」というわけではないですし。
むかーしは「とりあえず幾らでも入るtext型にしとけばいいや」というのがあって・・今でもレガシーシステムではほとんどがtext型でNotNullなしのもありますが^^;
投稿2018/09/18 23:26
総合スコア80850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/24 03:09
0
Webから入会登録する時、メルアドやパスワードはNOT NULL制約を付けて入力を必須とするが、住所や生年月日は任意とする時はNOT NULL制約は付けません。
表レベルのNOT NULL制約ってどんな機能を想定していますか?
投稿2018/09/18 23:03
総合スコア16415
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/18 23:12
2018/09/18 23:39
2018/09/24 02:59
2018/09/24 06:04
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。