这不起作用,我创建了触发器,但是当我在该表中插入某些内容时,会出现 #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 INSERT 上它正常工作。升级到 mariadb 11 后,AFTER 插入不再起作用,我必须在之前声明变量并且不在查询中使用 NEW.available_methods 。
有谁知道为什么会发生这种情况?我什至试图问chatgpt,但他的回答是,我引用“这很奇怪”:))。他告诉我这可能与 mariadb 的版本有关,但这并不能解释问题。
提前致谢
我首先尝试了第一个变体,我希望它能起作用
- 更新 -
这些是涉及的表:
--
-- 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了解无效的方法
根据提供的信息,这被写为 bug MDEV-32022
它超出了 Object NEW 的范围,因为您严格只能访问子句中的列
FROM
以及实现的变量。所以,至少在 MariaDB 中,您需要:
具有相同的效果。
你可以看到它在这里起作用。