12 Stimmen

Problem mit MySql INSERT MAX()+1

Ich habe eine einzige Tabelle mit vielen Benutzern. In dieser Tabelle habe ich eine Spalte namens user_id (INT), die ich für jede Person separat inkrementieren möchte. user_id MUSS bei 1 beginnen

Ich habe ein einfaches Beispiel vorbereitet:

Showing all names
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+

Showing only where name = Bob
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 2            | Bob                   |
| 3            | Bob                   |
+--------------+-----------------------+

Die folgende Abfrage wird dies tun, aber sie wird nur funktionieren, wenn 'Bob' bereits in der Tabelle existiert...

INSERT INTO users(user_id, name) SELECT(SELECT MAX(user_id)+1 from users where 
name='Bob'), 'Bob';

Wenn Bob nicht existiert (erster Eintrag), wird user_id auf 0 (Null) gesetzt. Das ist das Problem. Ich brauche die user_id ab 1 und nicht ab 0.

17voto

Lukáš Lalinský Punkte 39243

Sie können etwas wie dieses verwenden:

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

Eine solche Abfrage kann jedoch zu einer Race Condition führen. Vergewissern Sie sich, dass Sie sich in einer Transaktion befinden und die Benutzertabelle sperren, bevor Sie sie ausführen. Andernfalls könnten Sie am Ende zwei Bobs mit derselben Nummer haben.

6voto

Greg Punkte 306033

Sie können verwenden IFNULL :

INSERT INTO users(user_id, name)
SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';

3voto

Daan Punkte 1809

Es ist schon als Fehler in MySQL gemeldet .

Ich zitiere Guilhem Bichot:

Zweitens gibt es die einfachste aller Umgehungsmöglichkeiten:
statt zu verwenden:
insert into foo(lfd) values((select max(lfd) from foo)+1)
einfach tun
insert into foo(lfd) select (max(lfd)+1) from foo;

1voto

Verwenden Sie dann nicht MAX() + 1. Verwenden Sie ein automatisches Nummerierungsschema für die Tabelle.

Ich habe die Frage nicht richtig gelesen. Verwenden Sie Gregs Vorschlag von IFNULL().

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X