MySQL / SQL增加列

时间:2016-04-13 04:51:16

标签: java mysql sql database

我试图通过使列自动增量来跟踪点/统计数据。但是,它不能按我的意愿工作。如果行得到更新,我希望它自动递增,而不是添加新行。例如,如果我运行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

4 个答案:

答案 0 :(得分:1)

在这种情况下使用更新前触发器。将默认值设置为1.并使用触发器在每次更新时将其更新/递增1。

答案 1 :(得分:0)

来自mysql doc(http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html):

  

AUTO_INCREMENT属性可用于为新行生成唯一标识

所以你必须选择不同的方法:

  1. 从数据库中读取当前值
  2. 准备语句,同时更新计数值
  3. 问题:并发 您必须同步方法调用以使其成为线程安全的。

答案 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 ;