首页 > 解决方案 > Mysql:更新触发器错误:操作数应包含 1 列

问题描述

我在每次更新时创建了一个触发器。因此,每当来自“ABC”类的学生使用更新后的“A”级进行更新时,就必须执行以下嵌套的案例语句。我正在 Phpmyadmin 上编写此代码。table1 中的 current_status 应该使用从 start_date 到 End_date 的值进行更新

每当使用 start_date 和 end_date table1 更新 xyz 表时,应该像这样执行:

开始日期当前状态

2019 年 1 月 1 日 好

2019 年 2 月 1 日 中等

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 列

标签: mysqltriggersphpmyadmineventtrigger

解决方案


正如评论中提到的,您将遇到 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
$$

推荐阅读