如何解决MySQL要求最小长度
我使用的是MysqL Workbench,我制作了一个名为“ organizations”的表,并希望阻止任何向少于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()
是不确定的;我不确定为什么会这样。
至少在较旧的版本中,并且您未指定哪个版本,需要使用触发器来检查长度。
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中不存在该名称的内置函数。
使用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:
不允许使用存储的函数和用户定义的函数。
但是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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。