Prüfen ob Datensatz existiert
Sebbe
- datenbank
Hi Leute,
ich habe eine mySQL-Tabelle mit der Spalte 'Name'. Nun möchte ich, bevor ich einen Namen hinzufüge, prüfen, ob dieser bereits in der Tabelle enthalten ist.
Bisher habe ich das immer wie folgt gemacht:
$result = mysql_query("SELECT * FROM table_name WHERE Name='$name'");
$NumNames = @mysql_num_rows($result);
Dann stand in $NumNames entweder eine 1 oder eine 0.
Gibts da nicht eine bessere Möglichkeit?
mfg
Sebbe
ich habe eine mySQL-Tabelle mit der Spalte 'Name'. Nun möchte ich, bevor ich einen Namen hinzufüge, prüfen, ob dieser bereits in der Tabelle enthalten ist.
Bisher habe ich das immer wie folgt gemacht:$result = mysql_query("SELECT * FROM table_name WHERE Name='$name'");
Warum holst du den kompletten Datensatz, wenn du nur wissen willst ob er vorhanden ist?
Wenn $name eine Usereingabe ist, würde ich einen richtigen Quotingmechanismus verwenden, ansonsten ist dein Skript anfällig für SQL Injections.
Gibts da nicht eine bessere Möglichkeit?
Prinzipiell nicht.
Struppi.
Hi, danke für deine Antwort.
Aber so ganz verstehe ich nicht. Was meinst du mit Quotingmechanismus?
Kannst du vllt ein Codebeispiel nennen?
Aber so ganz verstehe ich nicht. Was meinst du mit Quotingmechanismus?
Kannst du vllt ein Codebeispiel nennen?
Ich kann kein PHP , aber das hilft vielleicht http://www.php-faq.de/q/q-sql-injection.html
Struppi.
Hallo,
Gibts da nicht eine bessere Möglichkeit?
Prinzipiell nicht.
Prinzipiell gibt es noch die Möglichkeit MYSQL per limit zu sagen, dass es nach dem ersten gefundenen Datensatz aufhören kann zu suchen.
Grüße
Marcus
Gibts da nicht eine bessere Möglichkeit?
Prinzipiell nicht.
Prinzipiell gibt es noch die Möglichkeit MYSQL per limit zu sagen, dass es nach dem ersten gefundenen Datensatz aufhören kann zu suchen.
Klar, aber er will den Wert nur einmal in der DB haben, d.h. die Abfrage ist, wie schon erwähnt, 1 oder 0. Ein Limit dürfte da nicht viel bringen.
Struppi.
Hallo,
Prinzipiell gibt es noch die Möglichkeit MYSQL per limit zu sagen, dass es nach dem ersten gefundenen Datensatz aufhören kann zu suchen.
Klar, aber er will den Wert nur einmal in der DB haben, d.h. die Abfrage ist, wie schon erwähnt, 1 oder 0. Ein Limit dürfte da nicht viel bringen.
Performance! Wenn ich ein SELECT * ohne LIMIT angebe wird die Datenbank alle Datensätze auf einen Treffer des Namens durchsuchen. Gebe ich ihr vor, dass ich nur den ersten Treffer will kann die Suche wesentlich schneller beendet sein.
Grüße
Marcus
Prinzipiell gibt es noch die Möglichkeit MYSQL per limit zu sagen, dass es nach dem ersten gefundenen Datensatz aufhören kann zu suchen.
Klar, aber er will den Wert nur einmal in der DB haben, d.h. die Abfrage ist, wie schon erwähnt, 1 oder 0. Ein Limit dürfte da nicht viel bringen.
Performance!
Was es alles gibt, da werd ich wohl noch einige eigene Abfragen optimieren könne. Danke.
Struppi.
echo $begrüßung;
Prinzipiell gibt es noch die Möglichkeit MYSQL per limit zu sagen, dass es nach dem ersten gefundenen Datensatz aufhören kann zu suchen.
Das ist so nicht richtig.
MySQL sucht in den angegebenen Tabellen die Datensätze, auf die die WHERE-Bedingung passt. (GROUP BY und HAVING lasse ich mal aus.) Diese gefundenen Datensätze werden nun gemäß ORDER BY sortiert. Erst jetzt kommt LIMIT an die Reihe und nimmt sich aus der Ergebnismenge das entsprechende Teilstück.
Wenn "es nach dem ersten gefundenen Datensatz" aufhört zu suchen, hätte es ORDER BY ignoriert.
echo "$verabschiedung $name";
Hallo,
Wenn "es nach dem ersten gefundenen Datensatz" aufhört zu suchen, hätte es ORDER BY ignoriert.
Aber bei SELECT * FROM table_name WHERE Name='$name' sehe ich kein ORDER BY.
Grüße
Marcus
echo $begrüßung;
Wenn "es nach dem ersten gefundenen Datensatz" aufhört zu suchen, hätte es ORDER BY ignoriert.
Aber bei SELECT * FROM table_name WHERE Name='$name' sehe ich kein ORDER BY.
Ja, da ist keins. Das ist dann auch nicht "prinzipiell" - auf diese deine Aussage bezog ich mich - sondern ein spezieller Fall.
Und dann kommt es auch noch darauf an, ob ein Index genutzt werden kann, wenn ich vom Handbuchkapitel LIMIT Optimization den ersten Anstrich richtig verstanden habe.
echo "$verabschiedung $name";
Hallo,
Und dann kommt es auch noch darauf an, ob ein Index genutzt werden kann, wenn ich vom Handbuchkapitel LIMIT Optimization den ersten Anstrich richtig verstanden habe.
Also ich lese das so:
If you are selecting only a few rows with LIMIT, MySQL uses indexes in some cases when normally it would prefer to do a full table scan.
Gesetzt den Fall, dass MYSQL keinen Index verwendet, weil ein Großteil der Daten der WHERE-Bedingung entspricht, kann es sein, dass mit LIMIT trotzdem über einen Index gesucht wird, was zu einem schnelleren Ergebnis führt.
If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. ... after the initial rows have been found, there is no need to sort any remainder of the result set, and MySQL does not do so.
Das heißt, dass LIMIT auch bei Verwendung von ORDER BY eine Performancesteigerung bringen kann.
Grüße
Marcus
echo $begrüßung;
ich habe eine mySQL-Tabelle mit der Spalte 'Name'. Nun möchte ich, bevor ich einen Namen hinzufüge, prüfen, ob dieser bereits in der Tabelle enthalten ist.
Gibts da nicht eine bessere Möglichkeit?
Du könntest einen Unique-Index auf die betreffende(n) Spalte(n) legen. MySQL weist dann Versuche einen Wert ein zweites Mal in diese Spalte(n) einzutragen mit einer Fehlermeldung zurück.
echo "$verabschiedung $name";
Hi,
Bisher habe ich das immer wie folgt gemacht:
$result = mysql_query("SELECT * FROM table_name WHERE Name='$name'");
$NumNames = @mysql_num_rows($result);
was riskant ist.
Zwischen der Abfrage, ob der Name existiert, und dem Einfügen des Datensatzes vergeht Zeit.
Zeit, in der sich die Existenz des Namens in der Tabelle ändern kann.
Wenn der Name in der Tabellenspalte eindeutig sein muß, dann mach, wie dedlfix schon vorschlug, einen unique-Index auf diese Spalte.
Die Prüfung vor dem Einfügen fällt dann weg - wenn der Name schon existiert, kriegst Du beim Einfügen eine entsprechende Fehlermeldung.
Man könnte zwar auch mit einer Transaktion arbeiten (Start der Transaktion, Abfragen, ob der Name in der Spalte schon existiert, falls nein, Einfügen, Ende der Transaktion), aber m.E. ist der Unique-Index der einfachere und performantere Weg.
cu,
Andreas