2015-11-02 171 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值的占位符。