kostenloser Webspace werbefrei: lima-city


MySQL: Update mit Tabellenrekursion

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. Autor dieses Themas

    vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    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
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!