3

問題が発生しました。

MySQL を使用して最初のチェック制約を設定しましたが、残念ながら問題が発生しています。テストに失敗するはずの行を挿入すると、とにかく行が挿入されます。

構造:

CREATE TABLE user (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  uname VARCHAR(10) NOT NULL,
  fname VARCHAR(50) NOT NULL,
  lname VARCHAR(50) NOT NULL,
  mail VARCHAR(50) NOT NULL,
  PRIMARY KEY (id),
  CHECK (LENGTH(fname) > 30)
);

挿入ステートメント:

INSERT INTO user VALUES (null, 'user', 'Fname', 'Lname', 'mail@me.now');

fname 列の文字列の長さは短すぎるはずですが、挿入されています。

ここで基本的な何かが欠けていると確信しています。

4

2 に答える 2

6

MySQLは、どのエンジンでも CHECK 制約を適用しません。なぜ列を VARCHAR(50) として
宣言するのに、長さを 30 文字に制限したいのですか?fname

とはいえ、唯一の代替手段はトリガーを使用することです。

CREATE TRIGGER t1 BEFORE INSERT ON user
 FOR EACH ROW BEGIN

   DECLARE numLength INT;
   SET numLength = (SELECT LENGTH(NEW.fname));

   IF (numLength > 30) THEN
     SET NEW.col = 1/0;
   END IF;

END;
于 2010-06-12T01:28:08.187 に答える