我试图通过使列自动增量来跟踪点/统计数据。但是,它不能按我的意愿工作。如果行得到更新,我希望它自动递增,而不是添加新行。例如,如果我运行update命令,它只会在我更新的行的“count”列中添加一个。 如果我添加一个新行,它将从0开始!
以下是我创建表格的代码:
statement = connection.prepareStatement(
"CREATE TABLE IF NOT EXISTS stats" +
"(" +
"id varchar(100) not null," +
"count int not null auto_increment," +
"PRIMARY KEY (id)," +
"KEY (count)" +
")"
);
statement.execute();
以下是我更新到特定行的方式:
connection = plugin.getHikari().getConnection();
statement = connection.prepareStatement("INSERT INTO stats (id) VALUES(?) ON DUPLICATE KEY UPDATE id=?");
statement.setString(1, id.toString());
statement.setString(2, id.toString());
statement.execute();
谢谢, - Nicster
答案 0 :(得分:1)
在这种情况下使用更新前触发器。将默认值设置为1.并使用触发器在每次更新时将其更新/递增1。
答案 1 :(得分:0)
来自mysql doc(http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html):
AUTO_INCREMENT属性可用于为新行生成唯一标识
所以你必须选择不同的方法:
问题:并发 您必须同步方法调用以使其成为线程安全的。
答案 2 :(得分:0)
我不确定你为什么会遇到这个问题。你罢了,恕我直言。您需要做的就是将count
设为INT NOT NULL
默认为0.然后您应始终执行INSERT ON DUPLICATE KEY UPDATE
,如下所示:
CREATE TABLE IF NOT EXISTS atickets_stats (
`id` VARCHAR(100) NOT NULL,
`count` INT(11) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
);
INSERT INTO atickets_stats (id) VALUES(1) ON DUPLICATE KEY UPDATE count = count + 1;
注意,我将count
列更改为INT(11) UNSIGNED
,因为我认为您不会在此处存储负值。如果您有负值,可以取出UNSIGNED
。
答案 3 :(得分:0)
1)从`count`列中删除AUTO_INCREMENT属性。
AUTO_INCREMENT不适合您要实现的目标。
2)将DEFAULT 1添加到`count`列
的定义中当一个新行插入表中,并且没有为`count`列提供值时,默认值将被分配给该列。
3)当尝试添加重复的`id`值时,重写INSERT语句以递增`count`列
INSERT INTO atickets_stats (id)
VALUES ( ? )
ON DUPLICATE KEY
UPDATE count = count + 1 ;