java - 优化/改进我的 SQL 更新

标签 java mysql sql optimization

好吧,我先声明一下。我对 SQL 很陌生,对此了解不多。我最近才开始使用它,并且一直在努力学习和改进。请解释您所说的任何内容,因为我可能无法理解常用术语等。

我现在编写的 SQL 代码按照我的预期工作,但是该字符串看起来令人讨厌,让我觉得这不太正确。

INSERT INTO reputations(uuid, warn, bandate, reasons, mods)
    VALUES ('{0}', '{1}', '{2}', CONCAT(reasons, '{3}'), CONCAT(mods, '{4}'))
    ON DUPLICATE KEY UPDATE warn = '{1}',
                            bandate = '{2}',
                            reasons=CONCAT(reasons, '{3}'),
                            mods=CONCAT(mods, '{4}')

在我的 Java 代码中,它看起来像这样: SQL in Java

正如您可能也看到的那样,我不知道如何正确格式化/缩进所有内容以便像这样使用。任何提示将不胜感激。

我还应该解释一下,{n} 只是空格,我可以将其替换为我想要的信息。例如,我将所有 {0} 替换为 UUID。

所以,我的问题是。有一个更好的方法吗?任何提示或帮助将不胜感激。干杯!

最佳答案

我不明白这部分:

VALUES ('{0}', '{1}', '{2}', CONCAT(reasons, '{3}'), CONCAT(mods, '{4}'))
------------------------------------^

使用列名应该会产生错误。

也许这就是您想要的声明:

INSERT INTO reputations(uuid, warn, bandate, reasons, mods)
    VALUES ('{0}', '{1}', '{2}', '{3}', '{4}')
    ON DUPLICATE KEY UPDATE warn = VALUES(warn),
                            bandate = VALUES(bandate),
                            reasons = CONCAT(reasons, VALUES(reasons)),
                            mods = CONCAT(mods, VALUES(mods));

ON DUPLICATE KEY部分中,您可以使用VALUES()从特定列获取新值。此外,我怀疑您可能确实希望为最后两个连接使用分隔符:

                            reasons = CONCAT_WS('; ', reasons, VALUES(reasons)),
                            mods = CONCAT_WS('; ', mods, VALUES(mods));

如果值曾经是NULL,则使用CONCAT_WS()会产生很好的副作用——它仍然会留下剩余的值。

关于java - 优化/改进我的 SQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26828909/

相关文章:

java - Camunda BPM Spring boot 无法在 weblogic 中启动 - 也许是 Jersey 问题

MySQL - 我可以限制查询运行的最长时间吗?

php - 如何将上午/下午格式的时间插入数据库

sql - 什么选择查询将列出 Postgres 中的域?

sql - Oracle 11g 第 2 版 : Can a sub-query be used within a create table check constraint?

java - 使用 java、eclipse 和 ant 自动复制构建的文件和库

java - Riak KV 2.1.1 Java客户端: No suitable method found for Client.执行()

java - 在 android 的 Quickblox 中创建新对话框时出现 nullpointerException

mysql - MAGENTO:如何导出 sku、数量和价格?

mysql - 如何锁定一个条目?