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

chmee

verstaubtes inventar
Premium-User
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.

Code:
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
 
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
 
(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
 
PHP:
// 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
 
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.
 
Zurück