我的数据库中有一列只包含一个计数器值。如果条目是新的,则该值应为1,否则如果条目正在更新,则该值将递增或递减。使用PreparedStatement执行递增和递减
我想弄清楚如何使用java.sql.PreparedStatement用于此目的。
这是我的理解是,SQL查询最终必须创建具有的样子:
INSERT INTO `DropletNames` (`Title`,`Count`) VALUES ('Travel to Mars',Count + 1)
我的问题是:如何创建此查询? (fyi:我知道Count + 1在这里是无关紧要的,因为INSERT应该始终将它设置为1,但我试图使用与UPDATE相同的INSERT语法)
我试着做下面的事情:
String query = "INSERT INTO `DropletNames` (`Title`,`Count`) VALUES (?,?)";
PreparedStatement stm = con.prepareStatement(query);
stm.setString(1,"Travel to Mars");
stm.setString(2,"Count + 1"); // I used this because I couldn't find a better way of setting this
然而,这明显会产生错误的结果,因为它试图插入“计数+ 1”的字符串,而不是评估计数+ 1
唯一的其他我能想到的办法这样做是:
String query = "INSERT INTO `DropletNames` (`Title`,`Count`) VALUES (?,Count + 1)";
PreparedStatement stm = con.prepareStatement(query);
stm.setString(1,"Travel to Mars");
但是我不确定这是否违反了构建SQL语句时使用PreparedStatement的setter方法的“最佳实践”规则。我看不出这会如何让我打开SQL注入或其他漏洞,但也许有一些我没有考虑过的东西。
有没有办法做到这一点使用PreparedStatement类,或者我的第二个解决方案,我应该这样做?
@Drew,以及他可以使用ON DUPLICATE KEY UPDATE语法 –
如果你想看到IODKU,请看我写的这个链接。有更好的我相信:http://stackoverflow.com/a/33319173 ...有些人会浪费几个小时,认为它是IOU(插入或更新)。不,它是IO ** DK ** U – Drew
阿德里安,你究竟想要算什么? –