Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
Smooth-Graphics
Threadersteller
Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht:
|
Verfasst Sa 20.12.2008 18:43
Titel [SQL] LEFT JOIN + UPDATE Problem |
|
|
Hey ihr,
ich bastel grad ne etwas komplexere Updatefunktion, jetzt muss ich zwei Tabellen aktualisieren.
Code: |
UPDATE contactdata AS c
LEFT JOIN
(
SELECT username AS uname
FROM user
)
AS u
ON u.uid='1'
SET u.uname='admin', c.website='http://xyz.abc-def.hij', c.icq='12345567', c.msn='fkwug@hotmail.de', c.openID='' WHERE u.uid='admin'
|
Darauf meldet SQL:
Zitat: | #1288 - The target table u of the UPDATE is not updatable |
Mag mir jemand kurz helfen, ist bestimmt nur nen dummer Denkfehler, aber ich packs grad nich so ganz
|
|
|
|
|
mAsuRa
Dabei seit: 14.05.2005
Ort: -
Alter: -
Geschlecht: -
|
Verfasst So 21.12.2008 07:57
Titel
|
|
|
Dein SQL Statment ist falsch !
|
|
|
|
|
Anzeige
|
|
|
pRiMUS
Dabei seit: 09.09.2003
Ort: Vienna
Alter: 48
Geschlecht:
|
Verfasst So 21.12.2008 08:49
Titel
|
|
|
ich hab so ein wirres konstrukt auch noch nie gesehen. n update statement kenn ich nur
Code: | update tabelle set foo = bar |
zumindest wenn man nach sql standards arbeitet.
|
|
|
|
|
Smooth-Graphics
Threadersteller
Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht:
|
Verfasst So 21.12.2008 09:50
Titel
|
|
|
Na schön. Ich brauch aber nun mal eins mit JOIN und das gehört durchaus auch zum SQL Standard.
Ich hab irgendwie keine Lust das ganze mit 3 SQL Statements hintereinander zu machen, was auch deutlich unperformanter wäre.
@masura: super^^
//also ganz falsch ist es sicher nicht, nur irgendwo hängt der wurm in der JOIN Verknüpfung.
//// mySQL Doku sagt:
Zitat: |
Sie können auch UPDATE-Operationen durchführen, die sich auf mehrere Tabellen beziehen. Allerdings können Sie ORDER BY oder LIMIT nicht in einer UPDATE-Anweisung für mehrere Tabellen verwenden. Die Klausel table_references listet die Tabellen auf, die im Join berücksichtigt werden. Die Syntax ist in Abschnitt 13.2.7.1, „JOIN“, beschrieben. Hier ein Beispiel:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
Das obige Beispiel zeigt einen inneren Join, der den Kommaoperator verwendet. UPDATE-Anweisungen für mehrere Tabellen können jedoch einen beliebigen Join-Typ verwenden, der für SELECT-Anweisungen zulässig ist, also etwa LEFT JOIN.
Sie benötigen die Berechtigung UPDATE nur für diejenigen in einer UPDATE-Anweisung für mehrere Tabellen referenzierten Spalten, die tatsächlich geändert werden. Die Berechtigung SELECT hingegen benötigen Sie für alle Spalten, die gelesen, aber nicht modifiziert werden.
Wenn Sie eine UPDATE-Anweisung für mehrere Tabellen verwenden, die auch InnoDB-Tabellen einbezieht, für die Fremdschlüssel-Constraints vorhanden sind, dann verarbeitet der MySQL-Optimierer die Tabellen unter Umständen in einer Reihenfolge, die sich von der ihrer Parent/Child-Beziehung unterscheidet. In diesem Fall schlägt die Anweisung fehl, und es wird ein Rollback durchgeführt. Stattdessen sollten Sie die Änderung dann in nur einer Tabelle durchführen und sich auf die ON UPDATE-Funktionalität verlassen, die InnoDB bietet, um andere Tabellen entsprechend zu ändern. Siehe auch Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“.
Zurzeit können Sie in einer Unterabfrage keine Aktualisierungsoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen. |
Aber es hat auch mit dem "normalen" JOIN statt nem LEFT JOIN nicht funktioniert.
Zuletzt bearbeitet von Smooth-Graphics am So 21.12.2008 09:58, insgesamt 2-mal bearbeitet
|
|
|
|
|
pRiMUS
Dabei seit: 09.09.2003
Ort: Vienna
Alter: 48
Geschlecht:
|
Verfasst So 21.12.2008 11:32
Titel
|
|
|
ich kann mir auch vorstellen das dein subselect dort mehr als nur ein ergebnis zurückliefert und das hier der hund begraben liegen kann.
das joins auch bei updates gehen war mir gänzlich neu.
|
|
|
|
|
Smooth-Graphics
Threadersteller
Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht:
|
Verfasst So 21.12.2008 11:42
Titel
|
|
|
pRiMUS hat geschrieben: | ich kann mir auch vorstellen das dein subselect dort mehr als nur ein ergebnis zurückliefert und das hier der hund begraben liegen kann. |
Leider nein, denn auch mit DISTINCT führt das Statement nicht zu einem korrekten UPDATE.
Nicht dass das jetzt dringend wäre, im Moment habe ich es einfach doch mit 2 Queries gelöst, aber es würde mich einfach interessieren, wie das nun mit nem Subselect und nem JOIN richtig geht. Man will sich ja auch weiterbilden.
@Primus: Ja, war mir bis dahin auch unbekannt, nichtmal in meiner SQL Referenz steht was darüber drin, aber im Internet findet man spärliche Informationen dazu...
//edit: Also es liegt definitiv am JOIN, ich habs nochmal umgeschrieben in:
Code: |
UPDATE contactdata, user
SET user.username='admin', contactdata.website='http://www.-.de/', contactdata.icq='123456', contactdata.msn='@.de', contactdata.openID=''
WHERE user.UID='1'
AND user.password='123456'
|
Nun ändert er mir zwar die Werte ab, allerdings bei allen usern, nicht nur bei user.UID='1'
Ich glaub da muss ich mich nochmal kurz mit dene JOINS befassen, da war doch was mit HAVING etc.
Zuletzt bearbeitet von Smooth-Graphics am So 21.12.2008 11:52, insgesamt 2-mal bearbeitet
|
|
|
|
|
m
Moderator
Dabei seit: 18.11.2004
Ort: -
Alter: -
Geschlecht:
|
Verfasst So 21.12.2008 11:56
Titel
|
|
|
Zitat: | das joins auch bei updates gehen war mir gänzlich neu. |
Joins in UPDATE/DELETE Statements laufen schon seit Version 4.x irgendwas...
|
|
|
|
|
Smooth-Graphics
Threadersteller
Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht:
|
Verfasst So 21.12.2008 12:03
Titel
|
|
|
Jaja, die JOINS...
So gelöst: simpel und einfach, die WHERE Klausel war falsch...
Code: |
UPDATE contactdata, user
SET user.username='admin', contactdata.website='http://www.x-y.de/'
WHERE user.UID=contactdata.UID AND user.UID='1'
|
|
|
|
|
|
|
|
|
Ähnliche Themen |
MySQL: Left JOIN Problem
JOIN LEFT
LEFT JOIN ?
SQL Abfrage mit LEFT JOIN bleibt hängen
[SQL] Problem mit Join Abfrage
Div Float Left Problem
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|