今だけ人気マンガ100円レンタル特集♪

以前、知り合いからデータベースのINT型の項目には出来ればNULLを許可しない(NOT NULL)方がいいと聞いたことがあるのですが、本当でしょうか?

現在不動産の物件データを登録するためのシステムを作成しており、
データベースの設計を行なっている最中なのですが、
例えば金額や面積など数字しか入力されない項目はINT型にしたいと考えています。
※データベースはMySQLになります。

ただし、
物件データ登録時に数字項目に何も入力されなければ「NULL」、
0以上の数値を入力されている場合にはそのままその数値をデータベースに登録したいと考えています。
※0を入力されている場合には「0」をそのまま入れたいです。

INT型の項目にはNULLを入れるのを避けた方がいい場合には、0を入れるような仕様に変更しようと考えているのですが、その辺のことについて教えて頂けると助かります。

ざっくりとした質問で申し訳ございませんが、宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

物件データ登録時に数字項目に何も入力されなければ「NULL」、0を入力されている場合には「0」


本来の意図としては正しいはずです。
Nullは本来、どの値を入れればいいのかわからない値ということなので、
数字がわからない=何も入力していない ということで、Nullを指定するのは正しいはずです。
しかし、
実際に使うときには、Nullは実に不自由なので、
Nullは使うなという話がでてきます。
## 私なら、入力区分 0=未入力、1=入力 と 数値(未入力は0)と別々に持つかもしれません。

というのは例えば、
金額 100万以上の物件は何件?
というSQLに対して、100件と答えがでて、
金額 100万未満の物件は何件?
というSQLに対して、50件と答えがでたとします。
じゃあ、全物件は?・・・172件だったりします。
何故?⇒Nullが22件だったためです。
(Nullは0とは違い、どちらの検索条件にも含まれません。)
・・・この不自由さを回避するために数値項目に、Not Null制約をつけることが多いです。
    • good
    • 1
この回答へのお礼

まさによく似た現象が発生して、一度お客さんから連絡を受けたことがありました。

お客さんが数値項目に敢えて「0」を入れられる可能性もあるのでNULLを入れるかどうか迷っていたのですが、
確かに、
>> 入力区分 0=未入力、1=入力
という項目を持たせると数値項目未入力の場合でも、データベースにはNULLではなく0を入れられますね。

非常に参考になりました。
ありがとうございます。

お礼日時:2013/01/24 09:57

int型項目に限らず、極力nullは避けた方が無難です。


nullを含んだテーブルの検索は、しばしば直感に反した動作をします。

詳しくは下記のページを見て下さい。
http://codezine.jp/article/detail/532?p=1
http://www.geocities.jp/mickindex/database/db_ge …
    • good
    • 0
この回答へのお礼

参考URLのページを見てみると、やはりNULLは極力避けた方が良さそうですね。
確かにプログラムを組んでいる時に、NULLが悪さをして困ったこともありました。

ありがとうございます。

お礼日時:2013/01/24 09:42

NULLはその項目のデータが存在しない意味ですので、SQLの結果が思わぬ誤動作やプログラム上のミス(たとえば空白とNULLを表示上どう区別するのか)の原因になる場合があります、どうしてもNULLが必要な場合を除きどの型においてもNOT NULLを宣言し、使わない事をお勧めします。

尚、INTには最大値と最小値があるので、INTを使用する場合は値が範囲に確実に入るかを確認する必要があります。
    • good
    • 0
この回答へのお礼

確かにユーザー側にデータを表示させる時に、空白とNULLをどのように区別すればいいのか、悩むことが起こりそうですね。

ありがとうございます。

お礼日時:2013/01/24 09:36

http://dev.mysql.com/doc/refman/5.1/ja/data-size …

データ効率化のためにはNOT NULLにした方がいいですね。
たとえば件数カウントや平均をとったりする際は
NULLを許可した方がすっきりしたSQLがかける場合もあります。

個人的には特殊なケースを除きテーブル作成時はNOT NULLにしています。
    • good
    • 0
この回答へのお礼

確かにNULLが入っていることを意識してSQLを書くと複雑になる場合もあるので、NOT NULLの方がいいですね。

ありがとうございます。

お礼日時:2013/01/24 09:30

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint型フィールドにnullを登録できない・・・

> insert into tbl_tst values (001,'',21000,,22,4400,'3~4日','∞')
とすると syntax error になってしまいます。

> insert into tbl_tst values (001,'',21000,'',22,4400,'3~4日','∞')
とすると out of range になってしまいます。

> insert into tbl_tst values (001,'',21000,0,22,4400,'3~4日','∞')
は通常に登録できます。

> insert into tbl_tst values (001,'',21000,'0',22,4400,'3~4日','∞')
も通常に登録できます。

4カラム目のフィールドなのですが、show fields で見ても
int(11) Null→YES  Default→NULLとなっております。
NULLを登録(何も値を入れない)したいのですが、
どうすればよいでしょうか。
ご存知の方いらっしゃいましたらご教示願います。
宜しくお願い致します。

> insert into tbl_tst values (001,'',21000,,22,4400,'3~4日','∞')
とすると syntax error になってしまいます。

> insert into tbl_tst values (001,'',21000,'',22,4400,'3~4日','∞')
とすると out of range になってしまいます。

> insert into tbl_tst values (001,'',21000,0,22,4400,'3~4日','∞')
は通常に登録できます。

> insert into tbl_tst values (001,'',21000,'0',22,4400,'3~4日','∞')
も通常に登録できます。

4カラム目のフィールドなのですが、show fields で見ても
int(...続きを読む

Aベストアンサー

insert into tbl_tst values (001,'',21000, NULL ,22,4400,'3~4日','∞')
です

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Qアクセスで数値型のフィールドにNullをいれたい

初歩的な質問ですが、お願いします。
データベースを用いたWebアプリケーションを作成中ですが、数値型のフィールドで、
どうしても空白になってしまう部分があります。
入力フォームが空欄だと、エラーになってしまいます。
明示的にNull値の入力を許可するように設定する、というところ
までは調べてわかったのですが、具体的にはどのように
したらよいのでしょうか?
VBAなどを使わないとダメですか?
よろしくお願いします。

Aベストアンサー

詳しい補足ありがとうございます。
mei0311さんが補足に書かれましたように、フィールドプロパティの規定値をNullにすれば大丈夫そうですね。
ですが、規定値を空欄にしても、入力エラーは出ませんでした(Access上の入力ですが)。

念のため確認させて頂きますが、DBに書き込みに行く際にフォームの入力内容をチェックして、「空欄だと何も書かない」というようにプログラムされていますよね?
数値型のフィールドに、プログラム的にNull文字列を書き込もうとエラーが出たような気がするのですが…(かなり過去の記憶ですのでイマイチ自信がありません)。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

QInteger変数をカラにしたいのですが

Dim x as Integer

x=100
~~~
何らかの処理
~~~
x=Empty

と言う感じで一回数値を入れてまたカラにしたいのですが、
Emptyですと0になってしまい、カラにはなりません。
カラにするにはどうしたらいいのでしょうか。
よろしくお願いいたします。

Aベストアンサー

Integer型は-32763~32767の範囲の数字が必ず入りますので空にはできません。
String型でしたらNULL(=Empty)にできるのですが。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング