【问题标题】:MySQL force variable to recalculateMySQL强制变量重新计算
【发布时间】:2021-05-29 04:33:11
【问题描述】:

我使用 MySQL 的事件调度程序定期执行代码,即每天或每小时。在我的代码中,我使用'CURDATE()'并将其分配给一个变量。不幸的是,MySQL 只在第一个实例中计算这个。它不会在每次迭代中重新计算它,这意味着第一次通过它会有正确的日期,但之后每次都会有错误的日期。如果我手动运行代码,即没有事件调度程序,也会发生同样的情况。

如何强制 MySQL 重新计算变量?

我试过这个(这个只在第一次有效):

SET @stmt := CONCAT('ALTER TABLE myTable ADD myColum_', DATE_FORMAT(NOW(), '%Y_%M_%D_%H_%m'), ' SMALLINT(5);');
PREPARE stmt from @stmt;
EXECUTE stmt;

还有这个(这个甚至第一次都不起作用):

PREPARE stmt from ALTER TABLE myTable ADD
CONCAT('myColumn_', DATE_FORMAT(NOW(), '%Y_%M_%D_%H_%mm'), '
SMALLINT(5);'); EXECUTE stmt;

【问题讨论】:

  • 如果您希望 CURDATE() 始终获取最新值,而不是简单地将变量用法替换为 CURDATE() 本身,这将使其始终获取最新值。
  • SET @stmt := CONCAT('ALTER TABLE myTable ADD column_', DATE_FORMAT(NOW(), '%Y_%M_%D_%H_%m'), 'SMALLINT(5);' );从@stmt 准备stmt;执行 stmt;
  • 如果不使用变量,我无法找到我想要的方法
  • 您能否更新问题以包含完整的代码 sn-p,这样会更容易提供帮助。
  • ':=' 在这种情况下似乎是多余的。当然'='就足够了。

标签: mysql variables mariadb


【解决方案1】:

所以你有两个问题NOW() 返回连接开始时的时间,无论执行了多少语句。 CURDATE() 将始终是最新的。

ALTER TABLE 中的语法不能采用任意表达式。

你可以做的是使用EXECUTE IMMEDIATE:

EXECUTE IMMEDIATE
  CONCAT('ALTER TABLE myTable ADD myColum_',
         DATE_FORMAT(CURDATE(), '%Y_%M_%D_%H_%m'),
         ' SMALLINT(5);')

【讨论】:

  • 这对我不起作用。我使用的是 5.2 版,所以我认为这就是原因
  • 您可以在准备好的语句中使用CURDATE()。作为一般规则,如果您使用一些非常旧且不受支持的东西,您可能应该在您的问题中提及它的版本。以上适用于10.2,回答时最低稳定的GA系列。
  • 真的不支持吗?我没有意识到这一点。所以基本上我需要改变我的整个操作系统来更新一个变量?
  • 它在哪里说它不支持和不支持到底是什么?
  • 没有其他方法可以实现吗?它不一定是约会。它可能只是一个不同的值。我只需要它,以便每次事件运行时,都会为新列赋予不同的标题。
猜你喜欢
  • 2020-09-02
  • 2017-12-20
  • 2020-12-10
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多