好吧,我先声明一下。我对 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 代码中,它看起来像这样:
正如您可能也看到的那样,我不知道如何正确格式化/缩进所有内容以便像这样使用。任何提示将不胜感激。
我还应该解释一下,{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/