Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用PreparedStatement执行递增和递减_Java_Mysql_Sql_Prepared Statement - Fatal编程技术网

Java 使用PreparedStatement执行递增和递减

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

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

我正试图弄清楚如何使用java.sql.PreparedStatement实现这一目的

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

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就可以工作了