質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

7回答

1071閲覧

SQL のNot Null 制約について

st-access_91s

総合スコア43

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2018/09/18 22:56

SQLの制約に関して、「Not Null制約は列レベルのみ」とあったのですが、なぜ表レベルで制約付けられないのでしょうか?列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。
自分で調べても以下のリンクのようなものしかなく、ちゃんとした理由が述べられているHPに辿り着けなかったので、こちらに質問させていただきました。

https://www.google.co.jp/amp/s/okwave.jp/amp/qa/q9363660.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/19 14:28

たくさんのご回答ありがとうございます。量が多いので返信が遅くなると思いますが、順次返答させていただきたいと思います。
guest

回答7

0

Not Null制約はカラムに対しての制約ですので、それをテーブルのオプション属性で可能にするみたいな話ですね。
もしそれをDBMSが実装するとしたら、実行時に参照するような作りではなく、Create時に各カラムにNot null制約を付加するような実装になるかと思われます。

ERツールにもそのような機能を持っているものは無いので、

列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。

というニーズがニッチなんだと思います。
若しくは、そういうのを楽だと思う人は自前でCreate文を生成するツールを作っているんでしょう。
実際、エクセルでのテーブル定義からCreate文を生成するものは良く見かけますし。

投稿2018/09/19 01:55

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/09/19 02:05

> エクセルでのテーブル定義からCreate文を生成するものは良く見かけますし。 マクロ1つ組めば割りと簡単にCREATE文(あとデフォルトデータのINSERTとか)もできあがるからかなり重宝しますね。
sazi

2018/09/19 02:12

最近は出来のいいER図ツールがあるので、もっぱらそれを利用していますね。
m.ts10806

2018/09/19 02:15

テーブル定義も出力してくれるものは本当に助かりますね。
st-access_91s

2018/09/24 23:11

返信遅くなって申し訳ありません。 ご回答ありがとうございます。 まだ理解が不十分ではありますが、表レベルでNot Nullを定義するのはSQLの構文で出来なくても、マクロなり何なりで代用可能ということは分かりました。 また、ER図の作成ツールも少し調べて見ました。確かに便利そうなので、今度時間を見つけて使ってみようと思います。
guest

0

列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。

表の定義はそんなに頻繁に行うものではありませんし、「表全体でNOT NULL」という機能があったところで、できることは増えません。まさに、「いちいち全ての列にNot Null 制約を付ける」だけで済む話です。

投稿2018/09/19 00:30

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/24 03:12

返信遅くなって申し訳ありません。 ご回答ありがとうございます。 う~ん、一辺にNot Null付けられた方が楽チン、というものでもないみたいですね…。
guest

0

単純に、すべての列を not null で定義したいことがほとんど無いからだと思います。
実際、私自身は今まで何百何千レベルでテーブル設計をしてきたと思いますが、一度もそのような機能が欲しいと思ったことはないですね。
すべての列が not nullであるテーブルももちろんあり得ますが、どちらかと言えばレアケースだと思います。

投稿2018/09/21 03:48

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/25 22:42

返信遅くなって申し訳ありません。 ご回答ありがとうございます。 そんなにたくさんのテーブル設計をされてきたんですね!?自分なぞ比にならない位、凄い…。 そしてその中でNot Null表レベル制約が欲しい場面がなかったとなると…やはり現実的には必要ないに近いようですね。
guest

0

単に複数列の制約が必要ないからじゃないでしょうか
複数列の制約でなければ列制約で十分なので表制約は不要ですよね?

ColumnA INT UNIQUE, ColumnB INT UNIQUE

UNIQUE(ColumnA, ColumnB)
混同しているような気がします。

列数が多く、かつ後から列を追加しない前提の場合等は、いちいち全ての列にNot Null 制約を付けるより楽ですし、制約の付け忘れも回避できるように思いまして。

それは全列にNot Null制約を付与する構文があればいいだけなのではないでしょうか?
そしてその構文を求める人はそれほど多くないので構文が拡張されたりしていないのでしょう

投稿2018/09/19 10:35

Satsuki_2981

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/25 22:36

返信遅くなって申し訳ありません。 ご回答ありがとうございます。 皆さんもおっしゃっているように、Not Nullの表レベル定義はニーズが低いみたいですね…。
guest

0

質問者さんはなんとなく大きな勘違いをしているように見受けられます
仮にnot nullだとしても""などデータが空であるかのようなデータは投入可能です
nullを弾くことは確かに重要ですが、nullを弾いたからといって
必須入力項目を確定させることにはなりません

投稿2018/09/19 04:56

yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/24 23:14

返信遅くなって申し訳ありません。 ご回答ありがとうございます。 確かに上記のようなものでもNot Null制約回避できるとなると、表レベルで定義できても万能ではなさそうですね。。。
guest

0

ベストアンサー

私見ですが、
DBだけで運用するということはほとんどないわけで、
DBを利用する側の言語では必ずバリデーションを入れます。
DBの方だけNotNullにしておけばそれでOKということはなくて、
実際に言語側でも必須チェックなどは必要となります。
それも自動で行うことはできないわけで、フレームワークなどでも「この列は必須」という設定が必要になります。

確かに「表レベルでかけられれば楽」という考え方は分からないでもないですが、
NotNullとする列には必ずきちんとした理由があるわけで(他の制約もですが)、
その理由を1つ1つの列に意識して・意図して制約を入れなければならないという意味で、表レベルでの制約はかけられなくなっているのではないでしょうか。

「とりあえずNotNullにしとけばいいや」というわけではないですし。
むかーしは「とりあえず幾らでも入るtext型にしとけばいいや」というのがあって・・今でもレガシーシステムではほとんどがtext型でNotNullなしのもありますが^^;

投稿2018/09/18 23:26

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/24 03:09

返信遅くなって申し訳ありません。 ご回答ありがとうございます。 そういえばDB単体で運用ってケースはほとんどないというのを、結び付けずに考えてしまいました。試験勉強中に気になったもので…(汗)。 なぜNot Nullでないのか、までしっかり考えて一つ一つ付けているというご意見、とても説得力がありますね…。
guest

0

Webから入会登録する時、メルアドやパスワードはNOT NULL制約を付けて入力を必須とするが、住所や生年月日は任意とする時はNOT NULL制約は付けません。

表レベルのNOT NULL制約ってどんな機能を想定していますか?

投稿2018/09/18 23:03

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-access_91s

2018/09/18 23:12

ご回答ありがとうございます。 すみません、あまり詳細に想定していたわけではありませんが、例えば氏名・年齢・役職・所属・入社年月等を入力する社員表とかで、Null不可としたい場合は表レベルで制約できたら良いな、と。
Orlofsky

2018/09/18 23:39

それは、列と行を混同しているのでしょう。 >氏名・年齢・役職・所属・入社年月 にNOT NULL制約を付ければ、氏名・年齢・役職・所属・入社年月のすべての行(レコード)にNOT NULL制約が適応されます。 Aさんは役職が必須だけど、Bさんの役職はNULLでも良い、って時はNOT NULL制約は付けられません。 実際にCREATE TABLEしてNULLの有無のあるINSERTを実行して動作確認されては? https://qiita.com/Papageno/items/7c40c5c084aeda2d9f8c
st-access_91s

2018/09/24 02:59

あ、役職一般でも必須の場合をイメージしてました。 上記のような動作確認は、昔、したことがあったように思います。
Orlofsky

2018/09/24 06:04

SQL入門教育なら今のテーブルでも良いですが、実務では役職を2つ、3つ兼務って社員も多いから実際は社員IDと役職IDをPRIMRY KEYとする別テーブルを用意しないとほとんどの会社では使えなかったりします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問