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
我正在使用 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