人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL 5.5について。

NOT NULLやUNIQUEなどの制約の中にCHECKがあると思いますが、MySQL 5.5では反映されない(使用できない)のでしょうか?
前にデータベースのバージョンによっては使えないものもあるとは聞いたことはありますが…。

mySQLのサイトをみたのですが英文でよくわかりません。

例えば、INTやBIGINTなどを設定したカラムに文字を入れた場合、
エラーを返したいと思っています。
今のところ、エラーは返さず、0が入力されてしまいます。
UPDATE文の場合、前のデータが0で上書きされてしまいました...。


PHPなどでSQL文を発行する際にチェックすればいいのかもしれませんが、
2重にチェックしたいと考えています。

MySQL 5.5でcheck制約が使えないのであれば、SQL文を発行する際にチェックする
しかないのでしょうか?
もしPHP側の不正入力のチェックもすり抜けてしまった場合、SQL側でエラーを出せればと思っているのですが。(保険的な対策として)

check制約が使えない理由などもあるのでしょうか

できれば詳しい説明をよろしくお願いします。

●質問者: htaccess404
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど
●100ポイント ベストアンサー

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
「二重にしたほうが安心」というような安直な思想を捨て、
しっかりとバリデーションするようにしたほうが結果的に良いとは思いますけどね


htaccess404さんのコメント
ありがとうございます。トリガをはじめて知りました。まだ勉強中なもので。

2 ● nattow
●100ポイント

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


htaccess404さんのコメント
ありがとうございます。助かりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ