MySQL: Update mit Tabellenrekursion
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
auslese
besitzen
code
eintrag
folgenden fehler
frage
inkonsistenz
kombination
lese
problem
set
sitz
spalte
spalten
statement
superior
tabelle
target
update
-
Ich sitze gerade an einer Update-Query, die einen Eintrag einer Tabelle ändert, basierend auf einem anderen Eintrag in der selben Tabelle. Dabei bekomme ich folgenden Fehler:
You can't specify target table 'm9' for update in FROM clause
Die Fehlermeldung sagt zwar eindeutig, woran es liegt. Aber ich frage mich, wie ich dieses Problem löse. Ich habe beim Update darauf geachtet, keine Spalte zu ändern, die ich dann aus dem anderen Eintrag auslese. Das heisst also, dass egal in welcher Kombination ich die Einträge lese oder update, nicht die geringsten Inkonsistenzen entstehen können. Trotzdem wird die Query von MySQL blockiert (warscheinlich aus Sicherheitsgründen). Weiss einer, wie sich das lösen lässt ?
Liebe Grüße
- VampireSilence -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Könntest du die Tabellenstruktur und das update-Statement, das du verwendet hast posten? Das würde es erleichtern, nach einer Lösung zu suchen.
-
Also es gibt 5 Spalten:
id: int rank: varchar superior: int is_superior: int creation_time: int
Ein Eintrag kann einen übergeordneten Eintrag besitzen, dessen Spalten geerbt werden sollen, wenn einer dieser Einträge verändert wird.
Query:
UPDATE `m9` SET `rank` = ".$rank." WHERE (`id` = '".$id."' OR (`superior` > 0 AND (SELECT `id` FROM `m9` AS `m10` WHERE ´m10´.`id` = `m9`.`superior` LIMIT 1) = '".$id."')) AND `is_superior` = 0;
$rank und $id werden vom Benutzer gewählt. Der Eintrag der zu verändern ist, ist also entweder selbst die ID, oder ist dem Eintrag untergeordnet, der diese ID besitzt, ohne jedoch selbst ein übergeordneter Eintrag zu sein (ja, den Satz muss man zweimal lesen). Ich komme also nicht umher, in der WHERE clause abzufragen, ob es einen übergeordneten Eintrag gibt, dessen ID übereinstimmt und der Einträge besitzt, die ihm untergeordnet sind. Die Abfrage bezieht sich allerdings nur auf die ID, die ja nicht verändert wird, somit sind Inkonsistenzen ausgeschlossen. Nur der Rank aller untergeordneten Einträge soll angepasst werden.
Woran MySQL letztlich aber scheitert ist ausschließlich das Subquery-SELECT, innerhalb des UPDATE-WHERE clause. Und mir kommt gerade kein (performanter!) Weg in den Sinn, wie ich das anders lösen sollte.
Liebe Grüße
- VampireSilence
Beitrag zuletzt geändert: 2.1.2011 21:42:10 von vampiresilence -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage