MySQL 触发器 - 将 SELECT 存储在变量中

标签 mysql sql triggers

我有一个触发器,我想要一个变量来保存从 SELECT 获得的 INT,因此我可以在两个 IF 语句中使用它,而不是调用 SELECT 两次。如何在 MySQL 触发器中声明/使用变量?

最佳答案

您可以使用 DECLARE 语法在 MySQL 触发器中声明局部变量。

这是一个例子:

DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (
  i SERIAL PRIMARY KEY
);

DELIMITER //
DROP TRIGGER IF EXISTS bar //

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = NEW.i;
  SET @a = x; -- set user variable outside trigger
END//

DELIMITER ;

SET @a = 0;

SELECT @a; -- returns 0

INSERT INTO foo () VALUES ();

SELECT @a; -- returns 1, the value it got during the trigger

当您为变量赋值时,必须确保查询仅返回单个值,而不是一组行或一组列。例如,如果您的查询在实践中返回单个值,那没关系,但一旦它返回多于一行,您就会收到“ERROR 1242:子查询返回多于 1 行”。

您可以使用LIMITMAX()来确保局部变量设置为单个值。

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT age FROM users WHERE name = 'Bill'); 
  -- ERROR 1242 if more than one row with 'Bill'
END//

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT MAX(age) FROM users WHERE name = 'Bill');
  -- OK even when more than one row with 'Bill'
END//

关于MySQL 触发器 - 将 SELECT 存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59379858/

相关文章:

php - 由于持久存在mysqli来自先前查询的结果,因此“未定义索引”

mysql - 从数据库表中获取相似的行

android - 房间 : deleting a ForeignKey or setting the ForeignKey to a default value

SQL - 与同一列中的多个值进行比较?

mysql触发器更新行

sql - oracle中插入或更新新记录时更新同一个表的记录

mysql - 连接两个表,其中外键是标准字符串与主键的串联

mysql查询避免多次查询

sql - 使用 EXISTS 查找具有最大值的行

postgresql - Postgres - “更新后”触发器不会触发