MySQL 如何使用OLD和NEW来访问受触发器影响的行中的列?
在SQL中,触发器是一种特殊的存储过程,它会在特定的数据库操作(例如插入、更新或删除)后自动执行。当触发器执行时,它有权访问触发其执行的表中的数据。使用OLD和NEW关键字,可以在触发器中访问被修改的行的旧值和新值。
阅读更多:MySQL 教程
OLD和NEW的定义
在触发器中,OLD和NEW是SQL Server系统提供的对表中数据的引用。这两个关键字指代触发器中数据的两个版本,可以用来访问表中的列并执行其他逻辑操作。这些关键字的具体含义如下:
- NEW:指代正在进行操作的行的新值。
- OLD:指代正在进行操作的行的旧值。
使用OLD和NEW
假设我们有一个名为tblStudents
的表格,其中存储着学生的成绩信息,如下所示:
CREATE TABLE tblStudents (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
math_score INT NOT NULL,
english_score INT NOT NULL,
science_score INT NOT NULL
);
现在我们想创建一个触发器,在每次更新任意一名学生的成绩时,将这名学生所在的所有班级的平均分计算出来并更新tblClasses
表格。我们可以使用以下代码创建这个触发器:
CREATE TRIGGER trgCalculateClassAverages
ON tblStudents
AFTER UPDATE
AS
BEGIN
UPDATE c
SET average_score = (s.math_score + s.english_score + s.science_score) / 3
FROM tblClasses AS c
JOIN inserted AS i ON i.class_id = c.id
JOIN tblStudents AS s ON s.class_id = c.id
WHERE i.math_score <> s.math_score
OR i.english_score <> s.english_score
OR i.science_score <> s.science_score;
END;
在这个触发器中,我们使用了inserted
和deleted
表,这两个表分别存储了更新前和更新后行的数据。在我们的情况下,只需要使用inserted
表,因为我们只关心新值。
在触发器的UPDATE语句中,我们使用了NEW和OLD关键字访问正在被修改的行的新旧值。我们使用JOIN
语句将tblClasses
和tblStudents
表连接起来,然后使用平均分计算公式计算出班级的平均分并将其存储到tblClasses
表中。
OLD和NEW的限制
使用OLD和NEW关键字访问数据有一些限制。以下是一些限制的示例:
- 不允许直接插入OLD和NEW关键字。
- 不允许在存储过程或函数中使用OLD和NEW关键字。
- 不允许使用OLD和NEW关键字访问非更新的表或未在触发器中更新的列。
需要注意的是,OLD和NEW关键字只在触发器中可用,而不是在普通的SQL查询中可用。同时,使用OLD和NEW关键字访问数据时,你需要谨慎操作,以确保你的代码正确地处理了空值和其他异常情况。
结论
使用OLD和NEW关键字,我们可以在触发器中访问正在被修改的行的旧值和新值,并执行其他逻辑操作。在大多数情况下,使用OLD和NEW关键字是非常有用的。但是,我们需要注意所有的限制,并且确保我们的代码正确地处理了所有可能的异常情况。