您好,感谢您查看此表,我有一张桌子(名字从真实姓名更改为其他信息,请忽略,请告知我您想要的桌子上是否还有更多信息)
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次触发(非常糟糕!)。我对触发器不是很了解,所以任何帮助都会很棒!
感谢您抽出宝贵的时间来阅读和帮助我:)
答案 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)
;