# [MySQL] INSERT INTO - Rückgabe der Zeilen-ID bei Existenz?



## chmee (1. November 2010)

Mir scheint, die Aufgabe ist einfach, aber auf der Suche finde ich nun keine Lösung, die es in einer Query realisiert. Ich möchte in einer Tabelle zB Namen(unique) eintragen. Wenn ein Name aber schon existiert, möchte ich die id zurückerhalten.


```
id  +  name
----+---------
1   +   liese
2   +   fred
```
Sozusagen die Rückgabe der id des Fundes, damit ich keine zweite Query losschicken muß.. Jede ähnlich passende Lösung ist gerne gehört

mfg chmee


----------



## Yaslaw (2. November 2010)

Also ein SELECT und INSERT kombiniert?

Willst du eine Procedure bauen oder nachher in PHP oder Java oder so weiter verarbeiten?

Denn INSERT und SELECT in dieser Art direckt im MySQL ohne Procedure kombiniert ist mir sehr unbekannt


----------



## chmee (2. November 2010)

(1) Ja, letztendlich wird in php weiterverarbeitet
(2) ich habe gehofft, dass bei Nicht-INSERT die id als Rückgabewert geschnappt werden könnte - anstatt eines schnöden FALSE/TRUE.

Im Endeffekt sollte ich mir keinen Kopf machen und einfach ein SELECT losschicken und abhängig von Erfolg oder Mißerfolg das INSERT hinterherwerfen..

mfg chmee


----------



## Yaslaw (3. November 2010)

Im true-Fall kannst du mit mysql_insert_id() die id auslesen


----------



## chmee (4. November 2010)

```
// Nachfragen, ob $getname schon existiert
// --
$result=mysql_query("SELECT * from Studenten WHERE name='".$getname."'");
while($row=mysql_fetch_array($result))
   { $id=$row['id']; }  
// wenn nicht, dann über Insert neuen Eintrag erstellen
//
if(!isset($id)){
   $result=mysql_query("INSERT INTO Studenten(name) VALUES ('".$getname."')");
   $id=mysql_insert_id();
}
echo $id."<br/>";
```
Irgendeine Optimierungsmöglichkeit? (Jedenfalls für irgendwann Fragende eine Basis zum Verständnisholen..)

mfg chmee


----------



## Yaslaw (4. November 2010)

Ich würde im Select nur die id ausgewählen und nicht alles. gff, reicht dann ein Indexscan anstelle von einem Fulltablescan

Ob zuerst der SELECT und dann der Insert oder umgekehrt (resultat testen mit mysql_insert_id($result) == 0) hängt davon ab, in welcher Kombination weniger aufrufe sind.
Wenn man also davon ausgeht, dass die meisten noch nicht erfasst sind, sollte man es umdrehen, das erspart dann in den meisten Fällen den SELECT. Wenn aber die meisten Zugriffe mit dem SELECT erledigt sind, ists so richtig.


----------

