我的數據庫中有一列只包含一個計數器值。如果條目是新的,則該值應爲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
阿德里安,你究竟想要算什麼? –