我的数据库中有一列只包含一个计数器值。如果条目是新的,则值应为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类来做到这一点,或者是我应该这样做的第二个解决方案?
答案 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