Увеличить поле базы данных на 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.