Увеличить поле базы данных на 1


158

С MySQL, если у меня есть поле, скажем, логины, как мне обновить это поле на 1 в команде sql?

Я пытаюсь создать запрос INSERT, который создает firstName, lastName и логины. Однако, если комбинация firstName и lastName уже существует, увеличьте число входа на 1.

так что таблица может выглядеть следующим образом ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

Я получил команду, которая при запуске вставит нового человека (например, Тома Роджерса) или увеличит число входов в систему, если имя Джона Джонса будет использовано ..

Ответы:


288

Обновление записи:

Простое увеличение должно помочь.

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

Вставьте новую строку или Обновить, если она уже есть:

Если вы хотите обновить ранее существующую строку или вставить ее, если она еще не существует, вы можете использовать REPLACEсинтаксис или INSERT...ON DUPLICATE KEY UPDATEпараметр (как продемонстрировал Роб Ван Дам в своем ответе ).

Вставка новой записи:

Или, может быть, вы ищете что-то подобное INSERT...MAX(logins)+1? По сути, вы выполняете запрос, подобный следующему - возможно, немного более сложный в зависимости от ваших конкретных потребностей:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
Кроме того, обязательно добавьте предложение WHERE в соответствии с вашим приложением.
BoltClock

Да неужели!! Я не знал, что ты мог сделать это !!! Так будет ли это работать? INSERT IGNORE mytable (firstName, lastName, logins) ЗНАЧЕНИЯ (Джон, Смит, logins = logins + 1)
Мэтт,

@Matt Нет, это INSERT, а не UPDATE. Если вы хотите сделать вставку, вам нужно будет получить максимум и добавить 1 к нему.
Сэмпсон

2
@Matt Ваш вопрос задавался "об обновлении этого на 1", что вызвало путаницу. Я думаю, что вы, возможно, ищете другое решение, на которое я ссылался в своем обновленном ответе.
Сэмпсон

1
@Jonathan Извините за путаницу .. Я обновил свой вопрос, надеюсь, это будет немного яснее ..
Мэтт

70

Если вы можете безопасно сделать (firstName, lastName) ПЕРВИЧНЫЙ КЛЮЧ или, по крайней мере, поместить на них УНИКАЛЬНЫЙ ключ, то вы можете сделать это:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

Если вы не можете этого сделать, то вам придется сначала выбрать тот первичный ключ, поэтому я не думаю, что вы могли бы достичь того, что вы хотите, в одном запросе.


1
64+ байтный первичный ключ не является хорошим предложением
Джон Блэк

Будет ли работать переменная вместо «1»? то есть ON DUPLICATE KEY UPDATE logins = logins + numLogins; (правильно отформатирован, конечно)
Мэтт

1
Остерегайтесь, ON DUPLICATE KEY UPDATEэто не полностью безопасно для репликации!
oucil

2

Вы не сказали, что пытаетесь сделать, но достаточно намекали на это в комментариях к другому ответу. Я думаю, что вы, вероятно, ищете столбец автоматического приращения

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

тогда никакой специальный код не требуется при вставке. Просто

insert into logins (username, password) values ('user','pass');

MySQL API имеет функции, чтобы сообщить вам, какой идентификатор пользователя был создан при выполнении этого оператора в клиентском коде.


2

Я не эксперт в MySQL, но вы, вероятно, должны посмотреть на триггеры, например, перед вставкой. В триггере вы можете выполнить запрос select в исходной таблице и, если он что-то нашел, просто обновить строку 'logins' вместо вставки новых значений. Но все это зависит от версии MySQL, которую вы используете.


2

Это скорее сноска к ряду приведенных выше ответов, в которых предлагается использовать ON DUPLICATE KEY UPDATE, ПОМНИТЕ, что это НЕ всегда безопасно для репликации, поэтому, если вы когда-либо планируете выход за пределы одного сервера, вам следует избегать этого и использовать два запроса. , один для проверки существования, а затем второй , чтобы либо UPDATE , когда существует строка, или , INSERTкогда это не так.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.