【发布时间】:2021-08-24 14:03:51
【问题描述】:
假设,我有下表:
CREATE TABLE `test` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Value` ENUM('VAL1','VAL2') NOT NULL,
PRIMARY KEY (`Id`) USING BTREE
) ENGINE=InnoDB;
以及以下触发器:
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `test` FOR EACH ROW BEGIN
SET NEW.`Value` := 'VAL1';
END $$
DELIMITER ;
现在我可以插入一些行,但如果我使用无效的枚举类型,我会收到错误:
INSERT INTO test VALUES (NULL, 'VAL2'); // Statement ok, "Value" is set to 'VAL1'
INSERT INTO test VALUES (NULL, 'VAL5'); // Exception 'SQL Fehler (1265): Data truncated for column 'Value' at row 1'
似乎在INSERT-Trigger 触发之前检查了有效的 ENUM 值。
这是为什么?如何建立触发器以将无效 ENUM 更改为有效 ENUM?
我看到了很多例子,显然没有发生这种行为。会不会是配置错误?我们使用 MariaDB 10.5.9。
【问题讨论】:
-
是的,每次都会进行数据类型检查:触发前、触发中、触发之间、触发前和插入前。 INSERT 独立于触发器,触发器相互独立。每个点的参数列表必须正确。这是无法改变的。见dbfiddle.uk/…
-
但是像 joshuaotwell.com/… 这样的例子是什么?顺便说一句,dbfiddle.uk ...谢谢你的链接! ;-)
-
在示例中,ENUM 值与零比较
0- 这不是 ENUM 列表值而是 ENUM 索引值,零值表示“设置为空字符串”。这是合法的。 -
@Akina,请将您的答案发布为答案,而不是 cmets。如果您满足用户的问题,他们就会继续前进,而 Stack Overflow 将收集越来越多的“未回答”问题。
-
对不起,我不明白。我认为,ENUM = 0 表示无效值,如文本中所述,而不是像 '' 这样的空字符串,必须在 ENUM 定义中将其定义为另一个值。如果无法在表中插入此值,那么示例触发器中的行
SET NEW.kind = 'other';有什么意义?总而言之,如果有效值不包含 OLD 和 NEW 值,就不可能在触发器中更改 ENUM?
标签: mysql enums triggers mariadb