使用PreparedStatement执行递增和递减

时间:2015-11-02 18:38:48

标签: java mysql sql prepared-statement

我的数据库中有一列只包含一个计数器值。如果条目是新的,则值应为1,否则如果条目正在更新,则值将递增或递减。

我试图找出如何使用java.sql.PreparedStatement来实现此目的。

据我了解,最终必须创建的SQL查询必须如下所示:

INSERT INTO `DropletNames` (`Title`,`Count`) VALUES ('Travel to Mars',Count + 1)

我的问题是:如何创建此查询? (fyi:我知道Count + 1在这里是不相关的,因为INSERT应该总是设置为1,但我试图使用与更新时相同的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

然而,这显然会产生错误的结果,因为它试图将“Count + 1”作为String插入,而不是计算Count + 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类来做到这一点,或者是我应该这样做的第二个解决方案?

2 个答案:

答案 0 :(得分:0)

如果要增加列值,则语法为

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

这只会为星期一列中的任何值添加1。同样,如果你想减小它的值,它将是

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

现在,您需要更改以使其成为预准备语句的唯一内容是WHERE值的占位符。

答案 1 :(得分:-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

输出:

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