优化/改进我的SQL更新

时间:2014-11-09 13:52:23

标签: 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}只是我用我想要的信息替换它的空格。例如,我用UUID替换所有{0}。

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

1 个答案:

答案 0 :(得分:1)

我不明白这一部分:

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));

如果值CONCAT_WS()NULL的使用会产生很好的副作用 - 它仍将保留其余值。