- ベストアンサー
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にチェックを任せたいのですが・・・ どなたかご存知の方、教えてください。 お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
マニュアルではこの部分ですね 使用状況次第では設定可能な様ですね
その他の回答 (3)
- naochancom
- ベストアンサー率61% (41/67)
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になります。 この辺も仕様なのでしょうね。
お礼
ご回答ありがとうございました。
- moon_night
- ベストアンサー率32% (598/1831)
Mysqlは Not Null とした場合でも、値がない場合は、NULLにならない値が自動的に入り、エラーは返しません。
お礼
ご回答ありがとうございます。
- nikuq
- ベストアンサー率22% (8/36)
そもそも、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です。
お礼
ご回答ありがとうございました。
補足
早速の回答ありがとうございます。 ちょっと、質問が悪かったせいか、求めている回答と違ったので補足します。 テーブル定義の際に、上記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の仕様なのかが知りたかったのですが、よろしくお願い致します。
お礼
皆様、ご回答ありがとうございました。 今回の質問の発端は、ホームページを移設するにあたり、 現在の環境が「ORACLE」、移設予定先が「MYSQL」の為、発生しました。 参考URLの情報を見ると、デフォルトの仕様みたいなので、プログラムの方で対応する検討をしてみます。 他の面でも大幅な改修や見直しが必要かも・・・ ちょっとブルーですが、おかげさまで一歩前進しました。 ありがとうございました。