Zwiększ pole bazy danych o 1


158

W przypadku MySQL, jeśli mam pole, powiedzmy loginy, jak powinienem zaktualizować to pole o 1 w poleceniu sql?

Próbuję utworzyć zapytanie INSERT, które tworzy firstName, lastName i loginy. Jeśli jednak kombinacja firstName i lastName już istnieje, zwiększ loginy o 1.

więc stół może wyglądać tak ...

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

John               Jones             1
Steve              Smith             3

Jestem po komendzie, która po uruchomieniu wstawiłaby nową osobę (np. Tom Rogers) lub zwiększyła loginy, gdyby użyta była nazwa John Jones.

Odpowiedzi:


287

Aktualizacja wpisu:

Prosty przyrost powinien załatwić sprawę.

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

Wstaw nowy wiersz lub Aktualizuj, jeśli jest już obecny:

Jeśli chcesz zaktualizować wcześniej istniejący wiersz lub wstawić go, jeśli jeszcze nie istnieje, możesz użyć REPLACEskładni lub INSERT...ON DUPLICATE KEY UPDATEopcji (jak zademonstrował Rob Van Dam w swojej odpowiedzi ).

Wstawianie nowego wpisu:

A może szukasz czegoś takiego INSERT...MAX(logins)+1? Zasadniczo należy wykonać zapytanie podobne do następującego - być może nieco bardziej złożone w zależności od konkretnych potrzeb:

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

3
Pamiętaj też, aby dodać klauzulę WHERE odpowiednio do aplikacji.
BoltClock

Naprawdę!! Nie wiedziałem, że możesz to zrobić !!! Więc czy to zadziała? INSERT IGNORE mytable (firstName, lastName, logins) VALUES (John, Smith, logins = logins + 1)
Matt

@Matt Nie, to jest INSERT, nie UPDATE. Jeśli chcesz zrobić wstawkę, musisz uzyskać maksimum i dodać do niej 1.
Sampson

2
@Matt Twoje pytanie dotyczyło aktualizacji o 1, co spowodowało zamieszanie. Myślę, że możesz szukać innego rozwiązania, o którym wspomniałem w zaktualizowanej odpowiedzi.
Sampson

1
@Jonathan Przepraszam za zamieszanie .. Zaktualizowałem moje pytanie, mam nadzieję, że jest to trochę jaśniejsze ..
Matt

70

Jeśli możesz bezpiecznie utworzyć (firstName, lastName) KLUCZ PODSTAWOWY lub przynajmniej umieścić na nich UNIKATOWY klucz, możesz to zrobić:

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

Jeśli nie możesz tego zrobić, musisz najpierw pobrać ten klucz podstawowy, więc nie sądzę, abyś mógł osiągnąć to, co chcesz w jednym zapytaniu.


1
64-bajtowy klucz główny nie jest świetną sugestią
Jon Black

Czy użycie zmiennej zadziałałoby w miejscu „1”? tj. NA DUPLICATE KEY UPDATE logins = logins + numLogins; (oczywiście poprawnie sformatowany)
Matt

1
Uważaj, ponieważ ON DUPLICATE KEY UPDATEreplikacja nie jest całkowicie bezpieczna!
oucil

2

Nie powiedziałeś, co próbujesz zrobić, ale dostatecznie dobrze to zasugerowałeś w komentarzach do drugiej odpowiedzi. Myślę, że prawdopodobnie szukasz kolumny z automatycznym zwiększaniem

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

wtedy na wkładce nie jest potrzebny żaden specjalny kod. Właśnie

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

Interfejs API MySQL ma funkcje, które informują, jaki identyfikator użytkownika został utworzony, gdy wykonujesz tę instrukcję w kodzie klienta.


2

Nie jestem ekspertem w MySQL, ale prawdopodobnie powinieneś spojrzeć na wyzwalacze, np. PRZED WSTAWIENIEM. W wyzwalaczu możesz uruchomić zapytanie wybierające na oryginalnej tabeli, a jeśli coś znalazło, po prostu zaktualizuj wiersz „logins” zamiast wstawiać nowe wartości. Ale wszystko to zależy od używanej wersji MySQL.


2

Jest to raczej przypis do wielu powyższych odpowiedzi, które sugerują użycie ON DUPLICATE KEY UPDATE, UWAŻAJ, że nie zawsze jest to bezpieczne replikacja, więc jeśli kiedykolwiek planujesz wyrosnąć poza pojedynczy serwer, będziesz chciał tego uniknąć i użyć dwóch zapytań , jeden, aby zweryfikować istnienie, a następnie drugi , UPDATE gdy istnieje wiersz lub INSERTgdy go nie ma.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.