Mysql:更新触发器错误:操作数应包含 1 列
Posted
技术标签:
【中文标题】Mysql:更新触发器错误:操作数应包含 1 列【英文标题】:Mysql:update trigger Error: Operand should contain 1 column(s) 【发布时间】:2020-01-14 10:59:28 【问题描述】:我在每次更新时都创建了一个触发器。因此,每当来自“ABC”类的学生使用更新后的“A”级进行更新时,就必须执行以下嵌套的案例语句。我正在 phpmyadmin 上编写此代码。 table1 中的 current_status 应该使用从 start_date 到 End_date 的值进行更新
每当 xyz 表使用 start_date 和 end_date 更新时 table1 应该这样执行:
开始日期当前状态
1/1/2019 好
2/1/2019 中等
2019 年 3 月 1 日好
2019 年 4 月 1 日好
2019 年 5 月 1 日 中等 当我运行它时,它不会显示任何错误,但是当我更新表时,我收到以下错误
CREATE DEFINER=`xyz`@`localhost` TRIGGER `studentgrades`
AFTER UPDATE ON `table1`
FOR EACH ROW
update db.table1 h
SET
current_status =
(
CASE
when date(new.start_date) <= date(new.end_date) THEN
CASE
WHEN new.student_class = 'ABC' and new.updated_grade='A'
THEN
CASE
WHEN statement 1 THEN 'Very Good'
When statement 2 THEN 'Good'
ELSE 'Moderate'
END
ELSE 'Moderate'
END
ELSE 'moderate'
END ,
date(new.start_date) =date_add(date(new.start_date) , INTERVAL 1 DAY)
) where h.start_date = date(new.start_date);
mysql 说:
1241 - 操作数应包含 1 列
【问题讨论】:
你的括号是不是有问题?看起来你在做current_status = ( 'moderate', date(new.start_date) =date_add(date(new.start_date) , INTERVAL 1 DAY) )
。我认为您可以将它们全部删除:current_status = CASE .... END , date ...
一旦你解决了语法问题,你就会遇到 MySQL 的限制......在更新触发器中,不可能对表中引用的表执行更新导致触发器被触发的语句...假设表(不幸命名)table1
在数据库中(不幸命名)db1
。此外,不可能为函数的结果赋值,即DATE(NEW.start_date)
。我们可以在 BEFORE INSERT
或 BEFORE UPDATE
触发器的上下文中为 NEW.start_date 赋值,但不能在 UPDATE 语句中。
@Pepper 如果我删除括号,它会显示语法错误
@spencer7593 当我使用 when date(new.start_date) 时,它开始显示错误。之前没有这个语句,它成功更新了表格
我指的不是 WHEN 子句中的条件...我指的是 SET
子句中的赋值,倒数第二行,一旦错位括号的问题是更正。如果此触发器在db1.table1
上,则无法在触发器内对db1.table1
执行UPDATE
。
【参考方案1】:
正如 cmets 所述,您将遇到 MySQL 对更新触发器的限制,即您无法更新触发器主体中的同一个表。您可以将 After 触发器更改为 Before 触发器
DELIMITER $$
CREATE DEFINER=`xyz`@`localhost` TRIGGER `studentgrades`
BEFORE UPDATE ON `table1`
FOR EACH ROW
BEGIN
SET NEW.current_status =
CASE
WHEN date(new.start_date) <= date(new.end_date) THEN
CASE
WHEN new.student_class = 'ABC' and new.updated_grade='A'
THEN
CASE
WHEN statement = 1 THEN 'Very Good'
When statement = 2 THEN 'Good'
ELSE 'Moderate'
END
ELSE 'Moderate'
END
ELSE 'moderate'
END;
END
$$
【讨论】:
这很酷。但是,我也需要一个增量语句。在这里,每当不同数据库的 table1 中有更新时,我想从开始日期到结束日期更新 db1.table 的当前状态。有可能吗? 如果两个表在不同的数据库中,AFTER 触发器可以正常工作。 非常感谢,我会试试的 。如果我想创建一个循环,语句应该一直运行到 date(new.start_date) = date(new.end_date)。因为,这导致我出现错误,显示 1241 - 操作数应包含 1 列 我认为错误是由原始帖子中的 WHEN 语句 1 THEN 'Very Good' 当语句 2 THEN 'Good' 引起的,即语句与数字 1 和 2 之间没有等号 (=)以上是关于Mysql:更新触发器错误:操作数应包含 1 列的主要内容,如果未能解决你的问题,请参考以下文章