【问题标题】:MariaDB: changing ENUM in a trigger raises exceptionMariaDB:在触发器中更改 ENUM 会引发异常
【发布时间】: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


【解决方案1】:

Akina(见第一条评论)是对的,即使在触发器中也无法更改未知的 ENUM 值。
我的解决方案是在ENUM-list 中包含所有可能的值。所以触发器可以完成它的工作并将“禁止”值更改为允许值。唯一需要注意的是现在有一些 ENUM 值没有在数据中使用。

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2015-03-08
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2014-01-20
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多