使用MySQL中的检查约束来控制字符串长度

ptr*_*trn 2 mysql check-constraints

我遇到了问题!

我已经使用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)
);
Run Code Online (Sandbox Code Playgroud)

插入声明:

INSERT INTO user VALUES (null, 'user', 'Fname', 'Lname', 'mail@me.now');
Run Code Online (Sandbox Code Playgroud)

fname列中字符串的长度应该太短,但无论如何都要插入.

我很确定我错过了一些基本的东西.

OMG*_*ies 7

MySQL 不会在任何引擎上强制执行CHECK约束.
这导致我问,为什么你会将fname列声明为VARCHAR(50),但是想强制它只能是30个字符?

也就是说,唯一的选择是使用触发器:

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;
Run Code Online (Sandbox Code Playgroud)

  • 从 MySQL 8.0.16 开始,遵守“check”约束 - https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html (4认同)
  • 甚至无法编译. (2认同)