mysql - 在 MySQL 触发器中,是否可以使用 NEW.column 设置用户变量并在更新查询中使用它?

标签 mysql

在此先感谢您的帮助。我环顾四周,找不到一个非常像我需要帮助的例子。我正在创建一个触发器来在插入后更新表,但在插入发生之前我不知道要更新的表名。这是我尝试使用的代码,但出现错误。

BEGIN
  SET @ven = NEW.`ven_code`;
  SET @ventable = concat('pp_ven_',@ven);
  UPDATE @ventable SET `stock_qty`=NEW.`endingStock` WHERE `iin`=NEW.`iin`;
END

最佳答案

如动态 sql/准备语句所述,这是不可能的。它会生成 错误代码:1336。在尝试 CREATE TRIGGER 时,存储函数或触发器中不允许动态 SQL

最接近自动化的方法是使用CREATE EVENT。事件是按您选择的时间表/间隔运行的预定存储程序。间隔是:

interval:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

您可以在一行上设置一个“标志”,例如您在上面描述的具有插入后触发器的表格。然后该事件可以执行 Prepared Statement动态地执行它。

Event Management 上查看我的回答.

我不得不说,即使在事件中运行,您提出的建议也几乎总是架构设计不佳的标志,无法很好地经受同行评审。

不允许动态sql和Prepared Stmt的一个原因是因为触发器需要很快,甚至DDL也可以潜入字符串并执行。并且像 ALTER TABLE 这样的 DDL stmts 在触发器中是不允许的(它们可能需要几个小时才能真正运行)。

您的模式也可以让一个表与作为区分列的 ven_code 列共享。 相反,您选择为每个 ven_code 创建新表。这通常是一个糟糕的设计和性能选择。

如果您在架构设计方面需要帮助,我很乐意在聊天室中与您讨论。

关于mysql - 在 MySQL 触发器中,是否可以使用 NEW.column 设置用户变量并在更新查询中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39461434/

相关文章:

php - 使用 PHP 连接数据库的最安全方法有哪些?

PHP 插入不起作用

python - Django 说字段不存在时它确实存在

mysql - 从 3 个表中选择 - 使用连接或联合?

mysql - Codeigniter mysql 查询组

用于获取类的顶级实例的 Mysql 查询

php - 如何清除登录到 joomla 前端和后端的同一用户的数据库 session ?

Mysql根据列id上的列内容创建新行

mySQL从两个表中的每一个中加入3列

php - MySQL 插入查询返回 false