Збільшення поля бази даних на 1


158

Якщо у MySQL, якщо у мене є поле, наприклад, логіни, як би я пішов на оновлення цього поля на 1 в команді sql?

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

тож таблиця може виглядати приблизно так ..

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

John               Jones             1
Steve              Smith             3

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

Відповіді:


287

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

Простий приріст повинен зробити свою справу.

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

О, справді !! Я не знав, що ти можеш це зробити !!! Так би це працювало? ВСТАВИТИ IGNORE mytable (firstName, lastName, 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'? тобто НА ДУПЛІКАЦІЙНІЙ КЛЮЧОВИЙ ОНОВЛЕННЯ логін = вхід + 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');

API MySQL має функції повідомляти вам про те, який користувальницький створений при виконанні цього оператора в коді клієнта.


2

Я не є експертом у MySQL, але ви, мабуть, повинні шукати тригери, наприклад, ДО ПЕРЕД ВСТАВКИ. У триггері ви можете запустити вибір запиту в початковій таблиці, і якщо він знайшов щось, просто оновіть рядок "логіни" замість того, щоб вставляти нові значення. Але все це залежить від вашої версії MySQL.


2

Це більше , виноска до числа відповідей вище , які передбачають використання ON DUPLICATE KEY UPDATE, BEWARE , що це НЕ завжди безпечно реплікації, тому якщо ви плануєте рости за межі одного сервера, ви хочете , щоб уникнути цього і використовувати два запити , один для перевірки існування, а потім другий або UPDATE коли рядок існує, або INSERTколи він ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.