当值为NULL时创建触发器使用旧值。嵌套异常错误

时间:2018-12-07 23:45:51

标签: mysql sql

您好,感谢您查看此表,我有一张桌子(名字从真实姓名更改为其他信息,请忽略,请告知我您想要的桌子上是否还有更多信息)

CREATE TABLE IF NOT EXISTS `example`.`coursetwo` (
  `candidate_no` INT(11) NOT NULL,
  `course_date` DATETIME NULL,
  `course_name` VARCHAR(45) NULL,
  PRIMARY KEY (`candidate_no`),
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

我在表格上有一个更新查询,该表格可以更新表的课程日期和候选人姓名。这是查询:

UPDATE coursetwo SET course_date=?, course_name=? WHERE candidate_no = ?;

当用户想返回并仅输入一个值时,说出course_name并提交,它将课程日期设置为null,而不保留先前的已知输入。

如果值为null,则创建触发器,然后使用旧值,但是出现嵌套异常错误:

  

发生意外错误(类型=内部服务器错误,状态= 500)。   PreparedStatementCallback; SQL的未分类SQLException [UPDATE coursetwo SET course_date = ?, course_name =? WHERE候选人_否=?]; SQL状态[HY000];错误代码[1442];无法更新存储函数/触发器中的表“ coursetwo”,因为调用该存储函数/触发器的语句已使用该表;嵌套...

这是我的触发器:

delimiter #
DROP TRIGGER IF EXISTS ifnull_keep_old_values# 
create trigger ifnull_keep_old_values after update on coursetwo
for each row
begin
    IF NEW.course_date IS NULL THEN
    UPDATE example
    SET course_date = OLD.course_date WHERE candidate_no = OLD.candidate_no;
    END IF;
END#
DELIMITER ;

有人知道这有什么问题吗,还有其他解决方法吗?我有许多要更改的表和列,并且每个表和列都必须执行约50次触发(非常糟糕!)。我对触发器不是很了解,所以任何帮助都会很棒!

感谢您抽出宝贵的时间来阅读和帮助我:)

1 个答案:

答案 0 :(得分:1)

因此,您希望在发生将course_date设置为NULL的更新时保留其当前值。

MySQL不允许您在触发器上更新同一表,而该触发器会在同一表上触发,因此会出现错误。

但是,在您的用例中,您要做的就是动态更改即​​将在BEFORE触发器中更新的值。

赞:

delimiter #
DROP TRIGGER IF EXISTS ifnull_keep_old_values# 
CREATE TRIGGER ifnull_keep_old_values BEFORE UPDATE ON coursetwo
FOR EACH ROW
BEGIN
    IF NEW.course_date IS NULL THEN SET NEW.course_date = OLD.course_date;
    END IF;
END#
DELIMITER;

如果要处理同一表上的更多列,请在同一触发器内执行。您只需要添加其他IF NEW.... IS NULL THEN NEW... = OLD...子句。如果要在其他表上实现相同的逻辑,则必须为每个表创建一个新的触发器。

这里是触发器的替代主体,它避免使用BEGIN/END块。 COALESCE函数将返回其第一个参数(此处为新课程日期),除非它为NULL,在这种情况下,将返回第二个参数(旧课程日期)。

CREATE TRIGGER ifnull_keep_old_values BEFORE UPDATE ON coursetwo
FOR EACH ROW
    SET NEW.course_date = COALESCE(NEW.course_date, OLD.course_date)
;