IF-Abfrage mit MySQL

NetPerformance

Erfahrenes Mitglied
Hallo,

ich komme mit der MySQL-IF-Anweisung nicht zurecht.

Ich würde gerne in diese Tabelle einen neuen Eintrag vornehmen. Der Eintrag darf nur vorgenommen werden, wenn (IF) die E-Mail Adresse nicht in der Tabelle vorhanden ist.

Der neue User muss bei der Registrierung (name, password und email) angeben. Natürlich kann ich das Problem mit zwei Anfragen leicht lösen. Ich würde gerne die kürzere Version einsetzen.

Tabelle: kunden (email = unique)
+---------+---------+-------------+------------+
| userid | name | passwort | email |
+---------+---------+-------------+------------+
| 1 | anja | 123 | a@a.de |
| 2 | tom | 321 | b@b.de |
| 3 | bob | yxz | c@c.de |
+---------+---------+------------+-------------+

Folgende Daten hat der neue user in das Eingabeformular eingegeben:
name = tim
password = supergeheim
email = a@a.de

Diese Anweisung funktioniert nicht.

SELECT userid, name, password, email, IF (email='a@a.de', 0, INSERT INTO kunden (name, password, email) VALUES ('roy', 'geheim', 'd @d.de') ) from kunden

Würde mich über jede Hilfe freuen.

Gruß
Aaron
 
Hallo, ich glaube du hast einen kleinen Fehler in deiner Query.
Du selektierst die email und prüfst ob die emailadresse vorhanden ist.
Vielleicht wäre es sinnvoller, zu prüfen, ob die emailadresse NICHT vorhanden ist und dann den INSERT-Befehl.

Eventuell:

SELECT email,
IF(email !='d@d.de', INSERT INTO kunden (name, password, email) VALUES ('roy', 'geheim', 'd @d.de') ) FROM kunden

werde es gleich mal ausprobieren.

Klappt nicht, werde mal nachsehen...
 
Zuletzt bearbeitet:
Also direkt in mysql habe ich keine Lösung gefunden, die beide Abfragen in eine vereint.

Für solche Dinge benutze ich in C# zwei Funktionen:

1. Datensatz suchen/vergleichen
Dazu nutze ich den DataReader, wenn dieser einen Datensatz findet:
If DataReader read()
... Ausgabe zb. "Datensatz schon vorhanden"
else
2. Funktion aufrufen, die den neuen Datensatz einfügt

Es gibt aber sicher eine Lösung für mysql, die Deiner Vorstellung entspricht...
 
Hallo,

ich sehe zwei Möglichkeiten:

1. Einen UNIQUE Key bzw. Primary Key auf die Spalte "email" legen. Damit erledigt das die Datenbank selbst, wenn es dir nur darum geht, das "nichts" passiert, wenn die Adresse schon da ist.

2. Eine Stored Procedure schreiben, die zuerst das SELECT durchführt um zu prüfen ob ein Datensatz mit der Email schon vorhanden ist und danach das INSERT ausführt.

Markus
 
Hallo,
1. Einen UNIQUE Key bzw. Primary Key auf die Spalte "email" legen. Damit erledigt das die Datenbank selbst, wenn es dir nur darum geht, das "nichts" passiert, wenn die Adresse schon da ist.
Ich hätte dazu eine Frage, wenn man das mit einen UNIQUE Key lösen würde, erspart man sich ja einen Query, sehe ich das richtig? Oder wo liegt der Vorteil gegenüber deiner zweiten Lösung? Bisher habe ich alles nach deiner zweiten Lösung geschrieben, wenn aber Lösung Nr.1 Vorteile hat, dann überlege ich es mir auch...
 
Hallo,

ja, im ersten Fall ersparst du die die Query, da ja die Datenbank das INSERT-Statement ablehnt. Das heisst du gibtst immer nur das INSERT-Statement an. Dann kannst ja Du ja die Fehlernummer prüfen oder einfach den Fehlertext ausgeben.

Im zweiten Fall mit der Stored Procedure hat es den Vorteil, dass du den Vorgang (SELECT, und darauffolgendes INSERT bzw. gleich das INSERT-Statement und das dazugehörige Exception-Handling) gekapselt hast und ändern kannst, ohne den aufrufenden Code ändern zu müssen.

Markus
 

Neue Beiträge

Zurück