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

标签 mysql sql triggers

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

最佳答案

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

这是一个例子:

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: Subquery return more than 1 row”。

您可以使用 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/324605/

相关文章:

javascript - 以编程方式触发 R 传单中的标记鼠标单击事件以获得 Shiny 效果

mysql - SQL按字符串顺序排序

mysql - 为自动删除订阅系统构建表

sql - Cordova 使用事务将大文件导入数据库

客户每月的 SQL 平均值

mysql - 找不到简单的 sql 列

Sql 触发器 - 它属于哪个表?

sql - 多个表的替代插入触发器

php - Laravel 5 加密 - 给定相同字符串的不同值?

mysql - 如何根据搜索结果删除mysql服务器中的用户?