こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

NOTNULL制約について

MYSQL ver4.0.20a
下記のようにNOTNULL制約を付けてテーブルを作成するのですが、
デフォルト値が勝手に設定されてしまいます。

CREATE TABLE TEST_01 (
NO int(8) NOT NULL auto_increment,
STATUS int(1) NOT NULL,
TOUROKUBI date NOT NULL,
MEMO varchar(200) NOT NULL,
PRIMARY KEY (NO)

INT型だと 0
varchar型だと ''
date型だと 0000-00-00

インサートの時に値がNULLの場合、SQLエラーを返してほしいのですが、
デフォルト値が設定されている為、登録されてしまいます。

本当はNOTNULL制約で、DBにチェックを任せたいのですが・・・
どなたかご存知の方、教えてください。
お願いします。

投稿日時 - 2006-09-13 18:29:25

QNo.2404196

困ってます

質問者が選んだベストアンサー

マニュアルではこの部分ですね
使用状況次第では設定可能な様ですね

参考URL:http://dev.mysql.com/doc/refman/4.1/ja/constraint-not-null.html

投稿日時 - 2006-09-14 16:38:08

お礼

皆様、ご回答ありがとうございました。

今回の質問の発端は、ホームページを移設するにあたり、
現在の環境が「ORACLE」、移設予定先が「MYSQL」の為、発生しました。

参考URLの情報を見ると、デフォルトの仕様みたいなので、プログラムの方で対応する検討をしてみます。
他の面でも大幅な改修や見直しが必要かも・・・
ちょっとブルーですが、おかげさまで一歩前進しました。
ありがとうございました。

投稿日時 - 2006-09-14 18:52:54

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

Mysqlでは、Table作成の際notnull制約をつけた
カラムについては、強制でデフォルト値が付いている
ようですね。

なので、
yoshi_t様が書かれているように、
intだと、デフォルト 0
dateだと、デフォルト 0000-00-00
のようになっています。
(desc TABLE_NAME;コマンドで確認可能)

なのでinsert文でカラムを省略すると
デフォルト値が入るので、エラーにならないことに
なります。

仕様だと思うのですが、どこに記載があるか分りません。>> どなたか知っていれば・・・

そのほかにも、
varchar(2)のカラムに10文字入れようとしても、エラーにならず、2文字でキレた値が入ります。
また、先ほどの、not null にupdate でnullを入れようとすると、0件のUpdateになります。
この辺も仕様なのでしょうね。

投稿日時 - 2006-09-14 15:24:21

お礼

ご回答ありがとうございました。

投稿日時 - 2006-09-14 18:41:24

ANo.2

Mysqlは Not Null とした場合でも、値がない場合は、NULLにならない値が自動的に入り、エラーは返しません。

投稿日時 - 2006-09-14 10:35:15

お礼

ご回答ありがとうございます。

投稿日時 - 2006-09-14 18:38:07

ANo.1

そもそも、NULL値とは空白の事ではないですよ。
MySQLではNULL値という空白でもデータでも無い値として認識しています。
カラムにデータを入れる際、空白とNULL値を分ける事で、検索時の区別をしています。
カラムにNOT NULLの設定をすると、このNULL値が格納されなくなるだけで、数字型や日付型のカラムを空白にする事はできません。
SQLデータベースに書き込む前のプログラムで空白をチェックしたり、
DBからデータを抽出する際にIF文を使用して値が0や0000-00-00 00:00:00を無効にするしかありません。
例:
select
if(hoge_num == '0','',hoge_num) as hoge_num,
if(hoge_time == '0000-00-00 00:00:00','',hoge_time) as hoge_time
from hoge_table
といった感じでDBからデータを抽出時に0を無視するといいかと思います。
まずは、MySQLマニュアルのNULL値についてを読んでみてください。
参考URLです。

参考URL:http://dev.mysql.com/doc/refman/4.1/ja/problems-with-null.html

投稿日時 - 2006-09-13 23:12:49

補足

早速の回答ありがとうございます。
ちょっと、質問が悪かったせいか、求めている回答と違ったので補足します。
テーブル定義の際に、上記CREATE TABLE文の様に、NOT NULLを定義しているにもかかわらず、下記のINSERT文で、登録されてしまうのが困ります。
INSERT INTO TEST_01 (STATUS) VALUES(5)
登録された行------------------------------
NO|STATUS|TOUROKUBI |MEMO
1 |5 |0000-00-00 |空白
------------------------------------------
「NO」はauto_incrementしているので良いとしても、
「TOUROKUBI」と「MEMO」は、値を入れようとしていないのに、
勝手に「0000-00-00 」と「空白」が登録されてしまいます。
本当は、エラーで返してほしいのに・・・

実はプログラムの中で、空白チェック等は行なっていますが、一定の条件下でURLを直たたきされると、チェックをと通らなくなってしまうバグが見つかりました。
「ORACLE」では、SQLエラーで落ちるのですが、MYSQLでは上記の様に通ってしまいます。
MYSQLの設定方法か、それともMYSQLの仕様なのかが知りたかったのですが、よろしくお願い致します。

投稿日時 - 2006-09-14 00:59:31

お礼

ご回答ありがとうございました。

投稿日時 - 2006-09-14 18:40:30