• ベストアンサー

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制約について詳しく書かれたページはないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

MySQLのバージョン5.0.51ではどうなのでしょうか。 以下のページを参考にしてみてください。 http://www.buena-idea.net/~hironobu/mysql/m-1-02.html 注1: 現在のところ、整合性(CHECK)制約はサポートされていません。

sweepea
質問者

お礼

おっと、そうだったんですね・・・。 私が見ていたリファレンスはよく見ると、5.1 でした。残念です。 http://dev.mysql.com/doc/refman/5.1/ja/create-table.html どうもありがとうございました。 (サポートしていないなら、エラーメッセージを返して欲しいですね。)

その他の回答 (2)

回答No.3

MySQLは、「標準SQL準拠」や「他のRDBMSとの文法上の互換性維持」のため、「文法エラーにはならないが、機能は働かない」といったパターンがあります。 CHECKもそうですし、例えば「primary key(c1 asc,c2 desc)」といったインデクス構成列の昇順と降順の混在も、エラーにはならないですが、実際はすべて昇順で定義されたりします。

sweepea
質問者

お礼

ありがとうございます。 > 文法エラーにはならないが、機能は働かない いちばん、困りますよね。やはりそうだったんですか。 今回は、1~100までの値を持った別テーブルを作って、 外部キーでそこを参照させる形をとりました。 ありがとうございました。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

MySQLは、文法的に合ってればできないことを指定しても文句を言わない傾向がありますね。 CHECK制約は効かなくても、5.0でもトリガーで実現はできます。 面倒ですが・・・

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/triggers.html
sweepea
質問者

お礼

ありがとうございます。 MySQL依存ですが、ENUMやSETという型でも実現できそうですね。 今回は、1~100までの値を持った別テーブルを作って、 外部キーでそこを参照させる形をとりました。 ありがとうございました。

関連するQ&A