2016-04-13 2 views
1

Я пытаюсь отслеживать точки/статистику, создавая автоматический прирост столбца. Тем не менее, он не работает, как я хочу. Я хочу, чтобы он автоматически увеличивался, если строка обновляется, а не добавляется новая строка. Например, если я запустил команду update, она просто добавит ее в столбец «count» для обновленной строки. Если я добавлю новую строку, она начнется с 0!MySQL/SQL Увеличение столбца

Вот мой код, чтобы создать таблицу:

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

Вы не можете выбрать из таблицы во время его обновления тот же запрос, так что это может стать немного волосатым. –

ответ

0

1) Удалите атрибут AUTO_INCREMENT из столбца `count`.

AUTO_INCREMENT не является подходящим механизмом для достижения того, чего вы пытаетесь достичь.

2) Добавить по умолчанию 1 для определения `count` колонке

Когда новая строка вставляется в таблицу, а значение не входит в комплект для` count` столбца, значение по умолчанию будет присваивается столбцу.

3) повторно написать заявление INSERT для увеличения `count` столбца, когда предпринимается попытка добавить дубликат` id` значение

INSERT INTO atickets_stats (id) 
VALUES (?) 
ON DUPLICATE KEY 
UPDATE count = count + 1 ; 
+0

Помогите с этим вопросом. Как это работает? –

+0

Когда оператор INSERT запускается, он попытается добавить новую строку в таблицу. Если в таблице уже существует строка, которая имеет значение «id», которое соответствует значению, указанному для «id» в INSERT, INSERT будет генерировать исключение «дубликат ключа» из-за PRIMARY KEY (уникальное ограничение) на 'id'. Если это произойдет, заголовок ON DUPLICATE KEY в заявлении будет запущен. И это выполняет операцию, эквивалентную «UPDATE atickets_stats SET count = count + 1 WHERE id =?». (Строка с указанным значением id будет обновлена. Текущее значение столбца count увеличивается на 1. – spencer7593

+0

У меня синтаксическая ошибка около ON –

0

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

Атрибут AUTO_INCREMENT может быть использован для создания уникального идентификатора для новых строк

Таким образом, вы должны выбрать другой подход:

  1. Прочитать текущее значение из базы данных
  2. Подготовить в вашем заявлении также будет указано значение счета

Проблема: параллелизм Вы должны синхронизировать вызов метода, чтобы сделать его потокобезопасным.

1

Использование Перед запуском обновления в этом случае. Установите значение по умолчанию на 1. и обновите/увеличьте его на 1 при каждом обновлении с помощью триггера.

+0

Что это значит? – Nicster15

0

Я не уверен, почему у вас возникла эта проблема. Вы близки, ИМХО. Все, что вам нужно сделать, это сделать countINT 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, если у вас будет отрицательное значение.

Смежные вопросы