【问题标题】:Node.JS + MySQL - Condensing 40+ UPDATE statements into just one with unique WHERE clauses in each oneNode.JS + MySQL - 将 40 多个 UPDATE 语句压缩为一个,每个语句中都有唯一的 WHERE 子句
【发布时间】:2017-11-30 05:56:16
【问题描述】:

我正在尝试制作一个冷却系统,其中包含一个 MySQL 数据库来存储冷却中的“剩余时间”。我目前有大约 50 个冷却时间需要管理,每秒更新一次数据库。是的,我需要 1 秒的准确度,不,我不能使用 vars,因为数据需要在应用程序重新启动后继续存在。所以这是我的代码:

function cooldowns() {
  connection.query("UPDATE users SET col1 = col1 - 1 WHERE col1 > 0")
  connection.query("UPDATE users SET col2 = col2 - 1 WHERE col2 > 0")
  connection.query("UPDATE users SET col3 = col3 - 1 WHERE col3 > 0")
  connection.query("UPDATE users SET col4 = col4 - 1 WHERE col4 > 0")
  connection.query("UPDATE users SET col5 = col5 - 1 WHERE col5 > 0")
  connection.query("UPDATE users SET col6 = col6 - 1 WHERE col6 > 0")
  connection.query("UPDATE users SET col7 = col7 - 1 WHERE col7 > 0")
  connection.query("UPDATE users SET col8 = col8 - 1 WHERE col8 > 0")
}

我有这些行,其中大约 40-50 行...全部用于不同的列。现在我知道我可以按照UPDATE users SET col1 = asd, col2 = asdf, etc 的方式做一些事情,但问题是WHERE 子句对于每个查询都是唯一的。如何将所有这些浓缩为一个查询?请注意,整个函数中的表名相同,但列和WHERE 子句不同。

【问题讨论】:

    标签: javascript mysql node.js database sql-update


    【解决方案1】:

    在当前情况下,运行多个查询似乎是您唯一的选择。

    但是,从您的示例看来,此处更新的所有列都是数字,并且条件是确保值不低于零。

    如果这是您要寻找的唯一约束,您可以采用不同的方法。稍微改变你的架构,将每列的数据类型从Int 更改为Int UNSIGNED。这将自动确保值不会低于零。为此类列分配负值将改为存储零。

    现在有了新架构,您可以运行单个查询,例如:

    function cooldowns() {
        connection.query("UPDATE users SET col1 = col1 - 1, col2 = col2 - 1, col3 = col3 -1 ...");
    }
    

    可以完全跳过 where 子句,或将其修改为其他必要的条件来选择行。

    【讨论】:

    • 这似乎有效,但另一个快速问题 - 当数字更新为尝试低于 0 时,如何让 MySQL 忽略操作?诸如 INSERT IGNORE 对主键所做的事情
    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多