2015-11-02 128 views
0

我的數據庫中有一列只包含一個計數器值。如果條目是新的,則該值應爲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類,或者我的第二個解決方案,我應該這樣做?

+0

@Drew,以及他可以使用ON DUPLICATE KEY UPDATE語法 –

+0

如果你想看到IODKU,請看我寫的這個鏈接。有更好的我相信:http://stackoverflow.com/a/33319173 ...有些人會浪費幾個小時,認爲它是IOU(插入或更新)。不,它是IO ** DK ** U – Drew

+0

阿德里安,你究竟想要算什麼? –

回答

-2

看完您的評論後,您似乎想要增加一個每天計算一個值的值。試試下面的例子:

--Create Schema 
CREATE TABLE #day(
    [ID] int, 
    [DayOfWeek] NVARCHAR(16), 
    [Value] INT 
) 
--Add Days 
INSERT INTO #day ([ID], [DayOfWeek], [Value]) VALUES 
    (1,'Sunday',0), 
    (2,'Monday',0), 
    (3,'Tuesday',0), 
    (4,'Wednesday',0), 
    (5,'Thursday',0), 
    (6,'Friday',0), 
    (7,'Saturday',0) 

--Increment Day Example 
UPDATE #day 
SET [Value] += 1 
WHERE [DayOfWeek] = 'Sunday' 

--Increment Day Based on the current day 
UPDATE #day 
SET [Value] += 1 
WHERE [ID] = DAY(GETDATE()) 

--Display Table 
SELECT * FROM #day 

OUTPUT:

ID DayOfWeek Value 
1 Sunday 1 
2 Monday 1 
3 Tuesday 0 
4 Wednesday 0 
5 Thursday 0 
6 Friday 0 
7 Saturday 0 
1

如果你想增加一列值那麼語法是

UPDATE `DropletNames` SET `Monday` = `Monday` + 1 WHERE `Title = "Travel to Mars" 

這將只需添加1到什麼值是星期一專欄。同樣,如果你想減少數值將是

UPDATE `DropletNames` SET `Monday` = `Monday` - 1 WHERE `Title = "Travel to Mars" 

現在你需要改變,使之成爲一份聲明中這樣的唯一的事情就是爲WHERE值的佔位符。