- ベストアンサー
MySQLのCHECK制約がうまくいきません。
scoreカラムに1から100までの整数しか入らないようにするには どうしたらいいですか? MySQLのバージョンは、5.0.51 です。 以下の文は、なんのエラーもなく、INSERTされてしまいます。 CREATE TABLE scores ( score INT NOT NULL, CHECK ( score BETWEEN 1 AND 100 ) ) ENGINE = InnoDB; INSERT INTO scores (score) VALUES (1000); どう書けばいいのでしょうか? もしくは、MySQLのCHECK制約について詳しく書かれたページはないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
MySQLのバージョン5.0.51ではどうなのでしょうか。 以下のページを参考にしてみてください。 http://www.buena-idea.net/~hironobu/mysql/m-1-02.html 注1: 現在のところ、整合性(CHECK)制約はサポートされていません。
その他の回答 (2)
- chukenkenkou
- ベストアンサー率43% (833/1926)
MySQLは、「標準SQL準拠」や「他のRDBMSとの文法上の互換性維持」のため、「文法エラーにはならないが、機能は働かない」といったパターンがあります。 CHECKもそうですし、例えば「primary key(c1 asc,c2 desc)」といったインデクス構成列の昇順と降順の混在も、エラーにはならないですが、実際はすべて昇順で定義されたりします。
お礼
ありがとうございます。 > 文法エラーにはならないが、機能は働かない いちばん、困りますよね。やはりそうだったんですか。 今回は、1~100までの値を持った別テーブルを作って、 外部キーでそこを参照させる形をとりました。 ありがとうございました。
- masa6272
- ベストアンサー率66% (93/140)
MySQLは、文法的に合ってればできないことを指定しても文句を言わない傾向がありますね。 CHECK制約は効かなくても、5.0でもトリガーで実現はできます。 面倒ですが・・・
お礼
ありがとうございます。 MySQL依存ですが、ENUMやSETという型でも実現できそうですね。 今回は、1~100までの値を持った別テーブルを作って、 外部キーでそこを参照させる形をとりました。 ありがとうございました。
お礼
おっと、そうだったんですね・・・。 私が見ていたリファレンスはよく見ると、5.1 でした。残念です。 http://dev.mysql.com/doc/refman/5.1/ja/create-table.html どうもありがとうございました。 (サポートしていないなら、エラーメッセージを返して欲しいですね。)