Gibt es eine intelligente Lösung dafür?

Dieses Thema im Forum "SQL und Datenbanken" wurde erstellt von jkreuzer, 08.08.2006.

  1. #1 jkreuzer, 08.08.2006
    jkreuzer

    jkreuzer Eroberer

    Dabei seit:
    03.12.2005
    Beiträge:
    55
    Zustimmungen:
    0
    Ort:
    München
    Hallo,

    ich möchte am besten mit einem einzigen SQL Befehl folgendes erreichen:
    Wenn in einer Tabelle ein Datensatz mit der ID 'id' schon existiert dann soll er die Spalte A mit einem bestimmten Wert updaten, wenn noch kein Datensatz mit der ID 'id' vorhanden ist, soll dieser angelegt werden und die Spalte A befüllt werden.

    Mit mehreren Befehlen ist es kein Problem, aber langweilig meiner Meinung nach.

    Kennt sich da jemand aus? Meine Versuche haben alle nicht funktioniert.

    Servus,
    Johannes
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Kesar_Neron, 09.08.2006
    Kesar_Neron

    Kesar_Neron Tripel-As

    Dabei seit:
    25.03.2006
    Beiträge:
    218
    Zustimmungen:
    0
    hmmmm...

    Hallo,

    würde einfach mal sowas sagen wie:

    UPDATE 'feld' WHERE 'id' = 'wert';
     
  4. #3 supersucker, 09.08.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Ich würde einfach mal so sagen du solltest vor dem Posten einer Antwort die Frage lesen.

    @jkreuzer

    IMHO geht das nicht mit einem SQL-Befehl, sowas würde man z.b. serverseitig mit PL/SQL lösen, oder halt eben mit mehreren SQL-Befehlen auf der Client-Seite.
     
  5. heady

    heady Routinier

    Dabei seit:
    13.12.2005
    Beiträge:
    424
    Zustimmungen:
    0
    Ort:
    im Herzen Europas
    tja ich weiß nicht ab welcher version und ob es unter mysql schon pl-sql gibt...(also das procedure-ding ;) )

    ich würde so ein problem mit procedures lösen
     
  6. #5 jkreuzer, 09.08.2006
    jkreuzer

    jkreuzer Eroberer

    Dabei seit:
    03.12.2005
    Beiträge:
    55
    Zustimmungen:
    0
    Ort:
    München
    Was sind denn procedures und wie arbeitet man damit?
    Ist für mich totales Neuland.
     
  7. #6 Bierhasser, 10.08.2006
    Bierhasser

    Bierhasser Grünschnabel

    Dabei seit:
    01.07.2005
    Beiträge:
    8
    Zustimmungen:
    0
  8. Kuli

    Kuli Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    Ort:
    Eichwalde
    Falls es noch interessiert:

    INSERT INTO table VALUES (1, 2, 3, 4) ON DUPLICATE KEY UPDATE a=c+3, b='Fromms';

    -Kuli
     
  9. #8 jkreuzer, 12.08.2006
    jkreuzer

    jkreuzer Eroberer

    Dabei seit:
    03.12.2005
    Beiträge:
    55
    Zustimmungen:
    0
    Ort:
    München
    Das klingt ja schon mal nicht schlecht. Problem ist nur, dass die ID kein KEY ist und es auch sein darf.
    Eigentlich ist es so, dass zwei Spalten zusammen den eindeutigen Datensatz bilden. Das hatte ich anfangs weggelassen, um es übersichtlicher und besser zu erklären.
    Kann man nach ON anstatt DUPLICATE KEY irgendeinen anderen Befehl schreiben?

    Servus,
    Johannes
     
  10. Kuli

    Kuli Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    Ort:
    Eichwalde
    Hallo Johannes,

    nein, das geht nicht. Du kannst natürlich einen UNIQUE INDEX setzen, aber dann muß die Spalte eben eindeutig sein.

    Die Konstellation ist aber auch seltsam. Du willst einen neuen Eintrag, wenn gar Eintrag mit der entsprechenden ID existiert, aber Du willst alle(?) Einträge ändern, wenn welche mit dieser ID existieren? Mal davon abgesehen, daß die Name ID dringendst vermuten läßt, daß es sich um eine (natürlich eindeutige) ID handelt (Du würdest ja auch keine Spalte NAME nennen, die dann nicht den Namen sondern die Telefonnummer beinhaltet), halte ich so einen Fall für sehr exotisch. Bist Du sicher, daß Du Dir Dein Tabellenmodell gut überlegt hast? Ansonsten denke ich, daß sowas so selten passiert, daß Du bequem mehrere Statements absetzen kannst.

    Wenn Du unbedingt willst, daß mußt Du eine Procedure definieren (geht aber erst ab 5.0). Wie das geht, steht in
    http://dev.mysql.com/doc/refman/5.0/en/stored-procedure-syntax.html

    Viel Spaß!
    -Kuli
     
  11. #10 jkreuzer, 15.08.2006
    jkreuzer

    jkreuzer Eroberer

    Dabei seit:
    03.12.2005
    Beiträge:
    55
    Zustimmungen:
    0
    Ort:
    München
    Hallo Kuli,

    danke für deine ausführliche Antwort.
    Es ist so: Ich möchte natürlich nicht alle Spalten ändern sondern nur bestimmte Daten neu eintragen.
    Zu dem Namen "ID": Er kommt aus einer anderen Tabelle, wo es eine echte ID ist. Zusammen mit einer anderen Spalte ergibt sich dann eine eindeutige Zuordnung für diese Tabelle.
    Ich habe es bis jetzt eh mit mehrern Befehlen gelöst, es hätte mich nur interssiert, ob es da was besseres gibt.

    Servus,
    Johannes
     
  12. Kuli

    Kuli Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    Ort:
    Eichwalde
    Hallo Johannes,

    ich meinte auch nicht alle Spalten, sondern alle Zeilen, aber egal.

    Als Name für die ID-Spalte würde ich dann AndereTabelle_ID nehmen, um Verwechslungen zu vermeiden, aber das ist natürlich Geschmackssache und nicht Thema dieser Diskussion.

    Eine kleine Anmerkung: Wenn Du parallele Threads oder mehrere DB-Clients hast, solltest Du aufs Locking achten, damit Dir nicht nach der Update-Prüfung jemand anders einen Insert unterjubelt. Wenn die Tabelle unter InnoDB läuft, dann ist alles in Ordnung, wenn Du die Existenz eines Eintrags mit passender ID mit dem UPDATE-Statement prüfst. Wenn Du mit einem SELECT prüfst, solltest Du FOR UPDATE hintendran hängen.:oldman

    Viel Vergnügen! :)
    -Kuli
     
Thema:

Gibt es eine intelligente Lösung dafür?

Die Seite wird geladen...

Gibt es eine intelligente Lösung dafür? - Ähnliche Themen

  1. Valve: »Es gibt keinen Grund für DirectX 12«

    Valve: »Es gibt keinen Grund für DirectX 12«: Auf der SIGGRAPH 2015 hat der bei Valve beschäftigte Entwickler Dan Ginsburg die Zukunft der Computergrafik erläutert und erklärt, dass es für...
  2. gibt es eine deutsche LinuxFromScratch community und eine Subdivision hier?

    gibt es eine deutsche LinuxFromScratch community und eine Subdivision hier?: gibt es eine deutsche LinuxFromScratch community und eine Subdivision hier?
  3. Ohai! (Gibt's keinen Sammelthread?)

    Ohai! (Gibt's keinen Sammelthread?): Einen wunderschönen Samstagnachmittag wünsche ich! Nachdem es keinen Sammelthread für Vorstellungen von Neulingen gibt werd' ich halt mal einen...
  4. Gibt es eine Startlog Datei für KDE4

    Gibt es eine Startlog Datei für KDE4: Wenn ich KDE 4.2 starte kommt direkt nach der Startmelody die Meldung, dass die Soundkarte nicht funktioniert. Und so ist es auch. Sowohl KDE noch...
  5. Gibt es auch eine richtige Firewall für...

    Gibt es auch eine richtige Firewall für...: Gibt es auch eine richtige Firewall für MS Windows? Ich kenne mich nur mit Iptables und Ipfilter unter Linux/Unix Systeme aus. Unter MS Windows...