- ベストアンサー
ENUM列に列挙されていない値を挿入しようとしたときエラーにすることは
ENUM列に列挙されていない値を挿入しようとしたときエラーにすることはできますか 例えば、 ENUM('-10', '-5', 'なし', '+5', '+10') と定義した列に対して、'+2'を挿入しようとした場合はエラーにしたいです。 現状では、'+2'を挿入しようとすると、2番目の値と解釈され、'-5'が挿入されてしまうようです。 バッチ処理が、やっとこさ終わったと思いきや、データを確認してみてビックリですx_x
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
MySQLのバージョンを、少なくとも MySQL 4.0、4.1、5.0といったレベルまで書きましょう。 ENUMの仕様をマニュアルで確認しましたか? 値は文字とすべきで、数字や数字としてキャスト可能な値での仕様は、混乱の元なので使用すべきでないと、例まで記述されています。 http://dev.mysql.com/doc/refman/5.1/ja/enum.html 今回のケースでは、 (1)'+2'と一致する値は、ENUMで定義されていない (2)(1)により、'+2'がインデックス値として使用可能と解釈された ということです。 対策としては、ENUM値を数値と解釈されないように、英字や日本語などを使えば、別の値と解釈されることはなくなります。 また、ENUMで未定義であった場合に、無効な値として0を格納したり、エラーとしたり(SQLモードで指定)といったことも可能です。この辺は、MySQL 4.1か5.0くらいに標準設定に変更があったように記憶しています。 http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
>さて、どうしよう・・・ >インデックス値を使用禁止にするモードがあれば、いいのにな 正規化して外部キー制約してみてはどうでしょう?
お礼
こんにちは、 外部キー制約とは、別のテーブルに列挙値を登録して参照するようなやり方でしょうか。 よく分からなかったので、不本意ですがVARCHAR型にすることにしました;; これなら予期しない文字列が来た場合でも、そっくりそのまま登録されるので・・・ ENUM型は1バイトしか消費しないので魅力的だったのですが、まあ仕方ない
お礼
こんにちは なんか、いきなり説教された感じですが・・・ 要は無理ということですね・・・ さて、どうしよう・・・ インデックス値を使用禁止にするモードがあれば、いいのにな