MySQL - IF THEN INSERT - Problem
vMief
- datenbank
Hallo Leute,
ich hänge jetzt seit einigen Stunden an einer eigentlich einfachen MySQL-Anweisung. Ich fange einfach mal mit meiner vorliegenden Datenbank an:
KTM\_Team\_hatKat
|-------|--------|
KatID | TeamID |
---|---|
1 | 1 |
3 | 5 |
7 | 1 |
------- | -------- |
Jetzt möchte ich in diese Tabelle zum Beispiel das Datenpaar (1, 2) einfügen (Also KatID=1 und TeamID=2). Aber vorher möchte ich überprüfen, ob dieser Datensatz schon in der Tabelle ist. Also wenn ich (3, 5) einfügen will, soll er das nicht machen, damit ich keine Redundanz habe.
Ich habe schon einiges mit IF und CASE probiert, aber es hat bis jetzt nie funktioniert. Und eine Überprüfung mit PHP möchte ich nicht, da mir das zu viel Ressourcen braucht.
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
ja!
Hallo Leute,
ich hänge jetzt seit einigen Stunden an einer eigentlich einfachen MySQL-Anweisung. Ich fange einfach mal mit meiner vorliegenden Datenbank an:
KTM\_Team\_hatKat
|-------|--------|
KatID TeamID 1 1 3 5 7 1 ------- -------- Jetzt möchte ich in diese Tabelle zum Beispiel das Datenpaar (1, 2) einfügen (Also KatID=1 und TeamID=2). Aber vorher möchte ich überprüfen, ob dieser Datensatz schon in der Tabelle ist. Also wenn ich (3, 5) einfügen will, soll er das nicht machen, damit ich keine Redundanz habe.
Ich habe schon einiges mit IF und CASE probiert, aber es hat bis jetzt nie funktioniert. Und eine Überprüfung mit PHP möchte ich nicht, da mir das zu viel Ressourcen braucht.
einfach ein Unique Index über die Spalten KatID und TeamID legen.
Spirituelle Grüße
Euer Robert
Tach!
Jetzt möchte ich in diese Tabelle zum Beispiel das Datenpaar (1, 2) einfügen (Also KatID=1 und TeamID=2). Aber vorher möchte ich überprüfen, ob dieser Datensatz schon in der Tabelle ist. Also wenn ich (3, 5) einfügen will, soll er das nicht machen, damit ich keine Redundanz habe.
einfach ein Unique Index über die Spalten KatID und TeamID legen.
Mit diesem Unique Index fügt man die Datensätze ohne vorherige Prüfung ein. Will man wissen, ob es den Datensatz schon gab, wertet man die dann zurückgemeldete Fehlermeldung daraufhin aus, ob es es Unique-Constraint-Verletzung war. Jede Meldung hat eine eindeutige Nummer. Einfach mal so einen Fehler provozieren, dann sieht man sie ja.
dedlfix.
Mit diesem Unique Index fügt man die Datensätze ohne vorherige Prüfung ein. Will man wissen, ob es den Datensatz schon gab, wertet man die dann zurückgemeldete Fehlermeldung daraufhin aus, ob es es Unique-Constraint-Verletzung war. Jede Meldung hat eine eindeutige Nummer. Einfach mal so einen Fehler provozieren, dann sieht man sie ja.
Leider bin ich in MySQL noch nicht so tief drin, deswegen muss ich leider gestehen, dass ich damit dem Unique Dingen nicht so ganz verstehe.
Aber vielleicht sollte ich noch sagen, dass das oben nicht die ganze Tabelle ist ;) es gibt noch eine dritte (bzw. erste) Spalte, mit einem eindeutigen Schlüssel (mit Autoinkrement) und die beiden oben abgebildeten Spalten sind Fremdschlüssel.
Kann man das ganze nicht vorher mit einem IF-THEN überprüfen? Bei mir gibt MySQL da immer einen Syntaxterror, aber ich weiß nicht wieso.
Tach!
Kann man das ganze nicht vorher mit einem IF-THEN überprüfen?
Man kann (in einer Stored Procedure oder im Client-Programm). Aber man macht das nicht, weil das problematisch ist.
Erstell einen Index. Der muss vom Typ Unique sein. Und der muss die beiden Spalten umfassen. Das geht recht problemlos mit dem phpMyAdmin (Struktur der Tabelle, Index hinzufügen). Dass du da noch mehr Spalten und andere Indexe in und auf der Tabelle hast, spielt dabei keine Rolle.
Bei mir gibt MySQL da immer einen Syntaxterror, aber ich weiß nicht wieso.
Ich auch nicht, weil du es nicht zeigst. Aber das musst du auch nicht, denn diese Lösung ist keine empfehlenswerte.
dedlfix.
Erstell einen Index. Der muss vom Typ Unique sein. Und der muss die beiden Spalten umfassen. Das geht recht problemlos mit dem phpMyAdmin (Struktur der Tabelle, Index hinzufügen). Dass du da noch mehr Spalten und andere Indexe in und auf der Tabelle hast, spielt dabei keine Rolle.
OK, hab das jetzt gemacht und es funktioniert. Danke für die Hilfe
Ich auch nicht, weil du es nicht zeigst. Aber das musst du auch nicht, denn diese Lösung ist keine empfehlenswerte.
Warum sollten Kontrollstrukturen Problematisch sein? Wenn du das kurz erläutern würdest, wäre das nett (einfach damit man sowas weiß)
Om nah hoo pez nyeetz, vMief!
Warum sollten Kontrollstrukturen Problematisch sein? Wenn du das kurz erläutern würdest, wäre das nett (einfach damit man sowas weiß)
Weil sich zwischen Prüfung und Eintragen der Datenbestand geändert haben könnte.
Matthias
Weil sich zwischen Prüfung und Eintragen der Datenbestand geändert haben könnte.
Matthias
Das leuchtet ein. Naja, in meinen Falle wäre das sowieso nicht (oder minimal) möglich gewesen. Aber trotzdem Danke für eure Hilfe.
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
ja!
Kann man das ganze nicht vorher mit einem IF-THEN überprüfen?
Man kann (in einer Stored Procedure oder im Client-Programm). Aber man macht das nicht, weil das problematisch ist.
Man müsste es dann sowohl beim Insert, als auch beim Update prüfen. Insert ist noch relativ einfach, Update wird schon komplizierter. Und man muss daran denken, dass die Trigger nich verloren gehen.
Wenn es nicht mehrere erlaubte Werte geben soll, die doppelt vorkommen dürfen, würde ich den Uique Index immer vorziehen. Der dürfte auch schneller sein.
Spirituelle Grüße
Euer Robert