【问题标题】:Update multiple rows in MySQL v8更新 MySQL v8 中的多行
【发布时间】:2021-08-05 03:02:09
【问题描述】:

在这些7 - 12 岁的问题中,投票最多的答案建议使用 MySQL VALUES 函数更新多行:

INSERT INTO chart (id, flag)
VALUES (1, 'FLAG_1'),(2, 'FLAG_2')
ON DUPLICATE KEY UPDATE id = VALUES(id), flag = VALUES(flag);

当我尝试使用 MySQL 8.0.20 版本时,收到了弃用警告

[HY000][1287] 'VALUES function' 已弃用,将在未来版本中删除。请使用别名(INSERT INTO ... VALUES (...) AS 别名)并将 ON DUPLICATE KEY UPDATE 子句中的 VALUES(col) 替换为 alias.col

MySQL worklog 建议改用别名。 'INSERT ... ON DUPLICATE KEY UPDATE Statement' docs中也提到过:

INSERT INTO chart (id, flag) 
VALUES (1, 'FLAG_1'),(2, 'FLAG_2') AS aliased
ON DUPLICATE KEY UPDATE flag=aliased.flag;

但是尝试这种新语法时出现错误:

[42000][1064] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 '' 附近使用正确的语法

使用 mysql 命令行工具,我可以使用新的别名语法更新表。为什么我不能在我常用的数据库工具 (Intellij Datagrip) 中执行此操作?

如何在 MySQL v8.0.20 及更高版本中更新多行而不出现弃用警告和错误?

【问题讨论】:

    标签: mysql sql mysql-connector datagrip


    【解决方案1】:

    问题中的新别名语法正确:

    INSERT INTO chart (id, flag) 
    VALUES (1, 'FLAG_1'),(2, 'FLAG_2') AS aliased
    ON DUPLICATE KEY UPDATE flag=aliased.flag;
    

    还要确保有:

    • MySQL v8.0.20 或更高版本
    • 您的 MySQL 连接器驱动程序支持 MySQL v8.0.20 及更高版本的功能

    带有我的数据库工具的 MySQL 连接器驱动程序是引发错误的罪魁祸首。它已设置为旧版本。

    您可以像这样更新您的 MySQL 连接驱动程序:

    在数据库视图中右键单击您的数据库连接 > 数据源属性 > 在底部它应该建议将您的驱动程序切换到版本 8.0.20:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2012-03-10
      • 2012-02-15
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多