NOT NULLやUNIQUEなどの制約の中にCHECKがあると思いますが、MySQL 5.5では反映されない(使用できない)のでしょうか?
前にデータベースのバージョンによっては使えないものもあるとは聞いたことはありますが…。
mySQLのサイトをみたのですが英文でよくわかりません。
例えば、INTやBIGINTなどを設定したカラムに文字を入れた場合、
エラーを返したいと思っています。
今のところ、エラーは返さず、0が入力されてしまいます。
UPDATE文の場合、前のデータが0で上書きされてしまいました...。
PHPなどでSQL文を発行する際にチェックすればいいのかもしれませんが、
2重にチェックしたいと考えています。
MySQL 5.5でcheck制約が使えないのであれば、SQL文を発行する際にチェックする
しかないのでしょうか?
もしPHP側の不正入力のチェックもすり抜けてしまった場合、SQL側でエラーを出せればと思っているのですが。(保険的な対策として)
check制約が使えない理由などもあるのでしょうか
できれば詳しい説明をよろしくお願いします。
MySQL5.5のマニュアルページより抜粋
http://dev.mysql.com/doc/refman/5.5/en/create-table.html
The CHECK clause is parsed but ignored by all storage engines.
5.1の日本語版では下記のように翻訳されています
「CHECK 条項は、全てのストレージ エンジンに解析されますが、無視されます。」
理由については特に触れられておらず「無いものは無い」と解釈するしかないです
対処として、トリガを用いる人も多いようです
検索結果例:http://blog.kimuradb.com/?eid=710163
「二重にしたほうが安心」というような安直な思想を捨て、
しっかりとバリデーションするようにしたほうが結果的に良いとは思いますけどね
MySQL では CHECK 制約はサポートされていなかったと思います。
http://dev.mysql.com/doc/refman/5.5/en/create-table.html
ちなみに、MySQL では標準 SQL 規格にのっとった SQL を記述していれば、サポートしてなくてもエラーとせず単に無視する方針を採っているようです。
なぜ CHECK 制約を採用していないかまではちょっとわかりませんでした。
(これは私の勝手な想像ですが、CHECK を入れるとパフォーマンスが低下するので MySQL のポリシー的に入れたくない、のかな?)
MySQL 上でチェックするための代替案としては TRIGGER を使用するのが比較的よく用いられる方法のようです。
http://www.google.co.jp/search?q=mysql+check%E5%88%B6%E7%B4%84+trigger