Überwindung des MySQL Fehlers 1093
- Ziel Tabelle für Update kann nicht angegeben werden
Wenn Sie mit MySQL arbeiten, können Sie auf den frustrierenden Fehler 1093 stoßen: “Sie können die Ziel Tabelle für ein Update in der FROM-Klausel nicht angeben.” Dieser Fehler tritt typischerweise auf, wenn Sie versuchen, von einer Tabelle zu aktualisieren oder zu löschen, während Sie gleichzeitig aus ihr in einer Unterabfrage auswählen. In diesem Blogbeitrag analysieren wir das Problem und bieten Ihnen effektive Lösungen, um Ihre Abfragen wieder reibungslos auszuführen.
Verständnis des Problems
In dem dargestellten Szenario hat der Benutzer eine Tabelle namens story_category
mit fehlerhaften Einträgen. Er hat versucht, diese Einträge mithilfe einer Unterabfrage in seiner DELETE
-Anweisung zu löschen:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id);
Beim Ausführen dieser Abfrage erhielt er die folgende Fehlermeldung:
#1093 - Sie können die Ziel Tabelle 'story_category' für ein Update in der FROM-Klausel nicht angeben
Dieser Fehler tritt auf, weil MySQL es nicht erlaubt, eine Tabelle (in diesem Fall story_category
) zu modifizieren, während gleichzeitig aus ihr ausgewählt wird. Lassen Sie uns erkunden, wie wir diese Einschränkung überwinden können.
Lösungsstrategien
1. Verwendung von Self-Join
Eine effektive Möglichkeit, um diesen Fehler zu umgehen, besteht darin, einen Self-Join zu verwenden. Diese Methode ermöglicht es Ihnen, Ihre Abfrage so umzugestalten, dass Sie eine Unterabfrage auf der Ziel Tabelle vermeiden. So funktioniert es:
DELETE a
FROM story_category AS a
INNER JOIN category AS b
ON a.category_id = b.id
WHERE b.id IS NULL;
In diesem Beispiel:
story_category AS a
bezeichnet die Haupttabelle, die wir ändern (oder von der wir löschen) möchten.category AS b
ist die Tabelle, mit der wir einen Join durchführen.- Indem sichergestellt wird, dass nur nicht vorhandene Kategorien-IDs übereinstimmen, entfernen wir die fehlerhaften Einträge aus
story_category
.
2. Verschachtelung der Unterabfrage
Wenn Sie eine Unterabfrage verwenden müssen, ziehen Sie in Betracht, diese tiefer innerhalb der Hauptabfrage zu verschachteln, um eine implizite temporäre Tabelle zu erstellen:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT * FROM (SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id) AS temp);
Dieser Ansatz umgeht den Fehler, indem MySQL die innere Unterabfrage als temporäre Tabelle behandelt und so eine direkte Modifikation der Ziel Tabelle vermeidet.
3. Anpassung des Abfrageoptimierers
Seit MySQL Version 5.7.6 wurden Änderungen am Abfrageoptimierer vorgenommen, die trotz der Verwendung des verschachtelten Unterabfragenaansatzes weiterhin zu diesem Fehler führen könnten. Wenn Sie auf dieses Problem stoßen, könnten Sie vorübergehend die Schalter des Optimierers anpassen:
SET optimizer_switch = 'derived_merge=off';
Dieser Befehl sagt MySQL, dass abgeleitete Tabellen nicht zusammengeführt werden sollen, was möglicherweise hilft, Ihre Abfragen auszuführen. Es ist jedoch wichtig, dies als kurzfristige Lösung oder für einmalige Aufgaben zu behandeln, da dies die Leistung und Ergebnisse der Abfragen beeinflussen kann.
Fazit
Den MySQL Fehler 1093 zu begegnen, wenn man versucht, Einträge in einer Tabelle zu löschen oder zu aktualisieren, kann ein häufiges Hindernis sein. Es gibt jedoch effektive Strategien, um dieses Problem zu bewältigen. Ob Sie sich entscheiden, die Tabelle mit sich selbst zu verknüpfen, Ihre Unterabfragen zu verschachteln oder die Einstellungen des Optimierers anzupassen – es ist wichtig, eine Methode auszuwählen, die mit Ihren Leistungszielen der Datenbank übereinstimmt.
Fühlen Sie sich frei, diese Lösungen zu erkunden und sie an Ihre spezifische Datenbankstruktur und -bedürfnisse anzupassen. Viel Spaß beim Abfragen!