ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:sweepea 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制約について詳しく書かれたページはないでしょうか?
質問投稿日時:08/03/29 10:38
質問番号:3904216
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

 

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

CHECKもそうですし、例えば「primary key(c1 asc,c2 desc)」といったインデクス構成列の昇順と降順の混在も、エラーにはならないですが、実際はすべて昇順で定義されたりします。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/01 02:07
回答番号:No.3
この回答へのお礼ありがとうございます。

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

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

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

回答

良回答10pt

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

CHECK制約は効かなくても、5.0でもトリガーで実現はできます。
面倒ですが・・・
種類:アドバイス
どんな人:専門家
自信:自信あり
回答日時:08/03/30 09:32
回答番号:No.2
参考URL: http://dev.mysql.com/doc/refman/5.1/ja/triggers.html
この回答へのお礼ありがとうございます。

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

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

回答

良回答20pt

回答者:auty MySQLのバージョン5.0.51ではどうなのでしょうか。

以下のページを参考にしてみてください。
http://www.buena-idea.net/~hironobu/mysql/m-1-02.html
注1: 現在のところ、整合性(CHECK)制約はサポートされていません。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/03/29 11:54
回答番号:No.1
この回答へのお礼おっと、そうだったんですね・・・。

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

どうもありがとうございました。
(サポートしていないなら、エラーメッセージを返して欲しいですね。)
 
最新から表示回答順に表示良回答のみ表示