MySQL 需要最小长度

MySQL require a minimum length

我正在使用 MySQL Workbench 并创建了一个名为 'organizations' 的 table 并希望阻止任何向小于等于的列添加值的尝试5 个字母。 列名是 'namee'。 我做了这个,但出现错误:

ALTER TABLE organizations
ADD CONSTRAINT MINIMO CHECK (LENGTH(namee) >= 5);

错误:

Error Code: 3814. An expression of a check constraint 'MINIMO' contains disallowed function: `LEN`.

这似乎很奇怪。这个有用吗?

ALTER TABLE organizations
    ADD CONSTRAINT MINIMO CHECK (LENGTH(namee) LIKE '_____');

我怀疑LENGTH()是non-deterministic;我不确定为什么会这样。

至少在旧版本中,您没有指定哪个版本,需要触发器来检查长度。

CREATE TRIGGER t1 BEFORE INSERT ON organizations
 FOR EACH ROW BEGIN

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

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

END;

考虑以下...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (my_string VARCHAR(20) NOT NULL);

SET @string = 'red';

INSERT INTO my_table SELECT @string FROM (SELECT 1)x WHERE CHAR_LENGTH(@string) >= 5;

SET @string = 'orange';

INSERT INTO my_table SELECT @string FROM (SELECT 1)x WHERE CHAR_LENGTH(@string) >= 5;

SELECT * FROM my_table;
+-----------+
| my_string |
+-----------+
| orange    |
+-----------+

我不确定您使用的是哪个版本,但它在 MYSQL 8.x

上对我来说工作正常
create table test_check(name varchar(10));

ALTER TABLE test_check
ADD CONSTRAINT MINIMO CHECK (LENGTH(name) >= 5);

根据您分享的错误消息,您显然试图使用函数 LEN()。 MySQL 中不存在该名称的 built-in 函数。

使用 MySQL 8.0.21 进行测试,如果我尝试使用 LEN() 或任何其他不存在的函数,我可以重现您显示的错误。

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.21    |
+-----------+
1 row in set (0.00 sec)

mysql> ALTER TABLE organizations ADD CONSTRAINT MINIMO CHECK (LEN(namee) >= 5);
ERROR 3814 (HY000): An expression of a check constraint 'MINIMO' contains disallowed function: `LEN`.

mysql> ALTER TABLE organizations ADD CONSTRAINT MINIMO CHECK (BOGUS(namee) >= 5);
ERROR 3814 (HY000): An expression of a check constraint 'MINIMO' contains disallowed function: `BOGUS`.

如果您曾尝试定义一个名为 LEN() 的存储函数并使用它,您应该阅读 https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html:

Stored functions and user-defined functions are not permitted.

但是 LENGTH() 可以正常工作。顺便说一句,我建议使用 CHAR_LENGTH() 这样多字节字符就被算作一个字符。

mysql> ALTER TABLE organizations ADD CONSTRAINT MINIMO CHECK (CHAR_LENGTH(namee) >= 5);
Query OK, 1 row affected (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0