dポイントプレゼントキャンペーン実施中!

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

A 回答 (3件)

MySQLのバージョン5.0.51ではどうなのでしょうか。



以下のページを参考にしてみてください。
http://www.buena-idea.net/~hironobu/mysql/m-1-02 …
注1: 現在のところ、整合性(CHECK)制約はサポートされていません。
    • good
    • 0
この回答へのお礼

おっと、そうだったんですね・・・。

私が見ていたリファレンスはよく見ると、5.1 でした。残念です。
http://dev.mysql.com/doc/refman/5.1/ja/create-ta …

どうもありがとうございました。
(サポートしていないなら、エラーメッセージを返して欲しいですね。)

お礼日時:2008/03/29 12:23

MySQLは、「標準SQL準拠」や「他のRDBMSとの文法上の互換性維持」のため、「文法エラーにはならないが、機能は働かない」といったパターンがあります。



CHECKもそうですし、例えば「primary key(c1 asc,c2 desc)」といったインデクス構成列の昇順と降順の混在も、エラーにはならないですが、実際はすべて昇順で定義されたりします。
    • good
    • 0
この回答へのお礼

ありがとうございます。

> 文法エラーにはならないが、機能は働かない
いちばん、困りますよね。やはりそうだったんですか。

今回は、1~100までの値を持った別テーブルを作って、
外部キーでそこを参照させる形をとりました。

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

お礼日時:2008/04/02 11:32

MySQLは、文法的に合ってればできないことを指定しても文句を言わない傾向がありますね。



CHECK制約は効かなくても、5.0でもトリガーで実現はできます。
面倒ですが・・・

参考URL:http://dev.mysql.com/doc/refman/5.1/ja/triggers. …
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

お礼日時:2008/04/02 11:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!