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制約が使えない理由などもあるのでしょうか

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/03/23 15:55:02
  • 終了:2012/03/23 21:04:32

ベストアンサー

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492012/03/23 16:31:40

ポイント100pt

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

id:htaccess404

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

2012/03/23 21:01:39

その他の回答(1件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492012/03/23 16:31:40ここでベストアンサー

ポイント100pt

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

id:htaccess404

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

2012/03/23 21:01:39
id:nattow No.2

nattow回答回数102ベストアンサー獲得回数272012/03/23 16:33:46

ポイント100pt

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

id:htaccess404

ありがとうございます。助かりました。

2012/03/23 21:02:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません