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 INSERTBEFORE 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 列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL必知必会读书笔记-8(表的操纵,视图,存储过程,游标,触发器)

MySql 错误:无法更新存储函数/触发器中的表

如果存在 MySQL 触发器语法错误

MySqlDb 在插入忽略语句中抛出操作数应包含 1 列

引发错误,防止 MySQL 触发器中的表更新

空字符串无法解释的MySQL错误#1064创建更新触发器后?