这不起作用,我创建触发器刚刚好,但当我插入的东西在该表中得到#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表示不能工作
2条答案
按热度按时间euoag5mw1#
根据提供的信息,这被写为一个错误MDEV-32022
atmip9wb2#
它在Object NEW的作用域之外,因为严格地说,您只能访问
FROM
子句中的列以及实现的变量。所以,你需要,至少在MariaDB中,比如:
这有同样的效果。
你可以看到它的工作here。