Java 使用PreparedStatement执行递增和递减
我的数据库中有一列只包含一个计数器值。如果条目是新的,则该值应为1,否则,如果条目正在更新,则该值将递增或递减 我正试图弄清楚如何使用java.sql.PreparedStatement实现这一目的 据我所知,最终必须创建的SQL查询必须如下所示:Java 使用PreparedStatement执行递增和递减,java,mysql,sql,prepared-statement,Java,Mysql,Sql,Prepared Statement,我的数据库中有一列只包含一个计数器值。如果条目是新的,则该值应为1,否则,如果条目正在更新,则该值将递增或递减 我正试图弄清楚如何使用java.sql.PreparedStatement实现这一目的 据我所知,最终必须创建的SQL查询必须如下所示: INSERT INTO `DropletNames` (`Title`,`Count`) VALUES ('Travel to Mars',Count + 1) 我的问题是:如何创建此查询?(仅供参考:我知道计数+1在这里有点不相关,因为INSER
INSERT INTO `DropletNames` (`Title`,`Count`) VALUES ('Travel to Mars',Count + 1)
我的问题是:如何创建此查询?(仅供参考:我知道计数+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”作为字符串插入,而不是计算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类来实现这一点,或者我的第二个解决方案是我应该实现这一点的方法?阅读您的评论后,您似乎希望增加一个每天计算一个值的值。请尝试以下示例:
--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
如果要增加列值,则语法为
UPDATE `DropletNames` SET `Monday` = `Monday` + 1 WHERE `Title = "Travel to Mars"
这只会在星期一列中的任何值上加1。类似地,如果要减小该值,它将
UPDATE `DropletNames` SET `Monday` = `Monday` - 1 WHERE `Title = "Travel to Mars"
现在,要将其转换为准备好的语句,唯一需要更改的是WHERE值的占位符。@Drew,他可能正在使用ON replicate KEY UPDATE syntaxi。如果您想查看IODKU,请参阅我写的此链接。我相信还有更好的:。。。有些人认为这是借条(插入或更新),会在上面浪费数小时。不,这是IODKUAdrian,你到底想数什么?本例中的
COUNT
列只是为了简化问题。事实上,我们一周中的每一天都有一个专栏。当引用标题
时,我们会增加星期几列,以确定它是星期几。每天午夜,我们将一天的计数器重置为0。然后,在一天中,我们总结了所有7项统计,试图确定用户的“本周最流行趋势”。这个问题可以应用于这7列中的任何一列。如果您给@DavidSoussan一个show create table DropletNames
或该表的任何名称,怎么样。然后他可以确保它有一个唯一的钥匙,这样IODKU就可以工作了