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`.
インサート自体にロジックを組み込むことができます
– ストロベリー
2020 年 9 月 3 日 15:59
------------------------
エラーに基づいてあなたが共有したメッセージでは、関数 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() はエラーなしで動作します。ちなみに、マルチバイト文字も 1 文字としてカウントされるように 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
0
------------------------
それは奇妙に思えます。これは機能しますか?
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);