mariadb中SET列的触发器未按预期工作

6qqygrtg  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(78)

这不起作用,我创建触发器刚刚好,但当我插入的东西在该表中得到#1054 -未知列'available_methods'在'字段列表'

CREATE TRIGGER `add_notification_type` AFTER INSERT ON `notification_types`
 FOR EACH ROW BEGIN
    INSERT IGNORE INTO unit_templates (unit, idkey, method)
    SELECT u.id AS unit, NEW.idkey, m.method
    FROM units AS u
    JOIN (
            SELECT 'sms' as method
            UNION ALL
            SELECT 'push'
            UNION ALL
           SELECT 'email'
            UNION ALL
            SELECT 'chat'
            UNION ALL
            SELECT 'info'
    ) AS m ON FIND_IN_SET(m.method, NEW.available_methods) > 0;
END

这一方法:

CREATE TRIGGER `add_notification_type` AFTER INSERT ON `notification_types`
 FOR EACH ROW BEGIN
    DECLARE available_methods_var VARCHAR(255);

    SET available_methods_var = NEW.available_methods;

    INSERT IGNORE INTO unit_templates (unit, idkey, method)
    SELECT u.id AS unit, NEW.idkey, m.method
    FROM units AS u
    JOIN (
        SELECT 'sms' as method
        UNION ALL
        SELECT 'push'
        UNION ALL
        SELECT 'email'
        UNION ALL
        SELECT 'chat'
        UNION ALL
        SELECT 'info'
    ) AS m ON FIND_IN_SET(m.method, available_methods_var) > 0;
END

这个问题只出现在SET/ENUM类型的列上(实际上我只试过SET)。奇怪的是,在mariadb 10.3上,这个问题只出现在AFTER UPDATE触发器上,但在AFTER update上它是工作的。升级到mariadb 11后,AFTER插入不再工作,我不得不在之前声明变量,而不是在查询中使用NEW.available_methods。
有人知道为什么会这样吗?我甚至试着问chatgpt,但他的回答是,我引用“这很奇怪”:)。他告诉我,这可能与mariadb的版本有关,但这并不能解释事情。
Thanks in advance
我首先尝试了第一个变体,我希望它能起作用
--更新--
这些是涉及的表格:

--
-- Table structure for table `notification_types`
--

CREATE TABLE `notification_types` (
  `idkey` varchar(40) NOT NULL,
  `title` varchar(100) NOT NULL,
  `editable` tinyint(1) NOT NULL DEFAULT 1,
  `has_days` tinyint(1) NOT NULL DEFAULT 0,
  `default_days` int(3) NOT NULL DEFAULT 0,
  `has_sessions` tinyint(1) NOT NULL DEFAULT 0,
  `default_sessions` int(3) NOT NULL DEFAULT 0,
  `available_methods` set('sms','push','email','chat','info') NOT NULL,
  `default_methods` set('sms','push','email','chat','info') NOT NULL,
  `class` set('announcements','info','marketing','system') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `units`
--

CREATE TABLE `units` (
  `id` int(11) NOT NULL,
  `name` varchar(40) NOT NULL,
  `active` int(1) NOT NULL DEFAULT 1,
  `waiting` tinyint(1) NOT NULL DEFAULT 0,
  `suspended` int(1) NOT NULL DEFAULT 0,
  `deleted` tinyint(1) NOT NULL DEFAULT 0,
  `deleted_time` int(20) NOT NULL DEFAULT 0,
  `acl` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `custom_fields` varchar(1000) NOT NULL DEFAULT '',
  `code` varchar(15) DEFAULT NULL,
  `settings` text NOT NULL DEFAULT '{}'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `unit_templates`
--

CREATE TABLE `unit_templates` (
  `unit` int(11) NOT NULL,
  `idkey` varchar(40) NOT NULL,
  `method` set('sms','push','email','chat','info') NOT NULL,
  `template` text DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

我没有包括索引
您可以看到https://dbfiddle.uk/8IjWUeOK表示可以工作,https://dbfiddle.uk/sZsQou4a表示不能工作

euoag5mw

euoag5mw1#

根据提供的信息,这被写为一个错误MDEV-32022

atmip9wb

atmip9wb2#

它在Object NEW的作用域之外,因为严格地说,您只能访问FROM子句中的列以及实现的变量。
所以,你需要,至少在MariaDB中,比如:

CREATE TRIGGER `add_notification_type` AFTER INSERT ON `notification_types`
 FOR EACH ROW BEGIN

    INSERT IGNORE INTO unit_templates (unit, idkey, method)
    SELECT u.id AS unit, NEW.idkey, m.method
    FROM units AS u
    JOIN (
        SELECT 'sms' as method
        UNION ALL
        SELECT 'push'
        UNION ALL
        SELECT 'email'
        UNION ALL
        SELECT 'chat'
        UNION ALL
        SELECT 'info'
    ) AS m CROSS JOIN ( SELECT NEW.available_methods) n ON FIND_IN_SET(m.method, NEW.available_methods) > 0;
END

这有同样的效果。
你可以看到它的工作here

相关问题