833 Stimmen

MySQL-Fehler 1093 - In der FROM-Klausel kann die Zieltabelle für die Aktualisierung nicht angegeben werden

Ich habe eine Tabelle story_category in meiner Datenbank mit fehlerhaften Einträgen. Die nächste Abfrage gibt die beschädigten Einträge zurück:

SELECT * 
FROM  story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category INNER JOIN 
       story_category ON category_id=category.id);

Ich habe versucht, sie zu löschen und auszuführen:

DELETE FROM story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category 
      INNER JOIN story_category ON category_id=category.id);

Aber ich erhalte den nächsten Fehler:

1093 - Sie können die Zieltabelle 'story_category' für die Aktualisierung in der FROM-Klausel nicht angeben

Wie kann ich dieses Problem lösen?

5 Stimmen

3 Stimmen

Es sieht so aus, als ob der Feature Request im MySQL Bug Tracker hier ist: keine Aktualisierung einer Tabelle und Auswahl aus derselben Tabelle in einer Unterabfrage möglich

3voto

briankip Punkte 2348

Según die Mysql UPDATE-Syntax von @CheekySoft verlinkt, steht es ganz unten.

Derzeit ist es nicht möglich, eine Tabelle zu aktualisieren und aus derselben Tabelle in einer Unterabfrage auszuwählen.

Ich vermute, dass Sie aus store_category löschen, während Sie in der Vereinigung weiterhin aus dieser Kategorie auswählen.

2voto

Versuchen Sie, das Ergebnis der Select-Anweisung in einer separaten Variablen zu speichern und diese dann für die Löschabfrage zu verwenden.

2voto

Sameer Khanal Punkte 1069

Versuchen Sie dies

DELETE FROM story_category 
WHERE category_id NOT IN (
SELECT DISTINCT category.id 
FROM (SELECT * FROM STORY_CATEGORY) sc;

1voto

Tom Schaefer Punkte 887

Wenn etwas nicht funktioniert, wenn Sie durch die Vordertür kommen, dann nehmen Sie die Hintertür:

drop table if exists apples;
create table if not exists apples(variety char(10) primary key, price int);

insert into apples values('fuji', 5), ('gala', 6);

drop table if exists apples_new;
create table if not exists apples_new like apples;
insert into apples_new select * from apples;

update apples_new
    set price = (select price from apples where variety = 'gala')
    where variety = 'fuji';
rename table apples to apples_orig;
rename table apples_new to apples;
drop table apples_orig;

Es ist schnell. Je größer die Daten, desto besser.

15 Stimmen

Und Sie haben gerade alle Fremdschlüssel verloren, und vielleicht haben Sie auch einige kaskadierende Löschungen.

0 Stimmen

Vielleicht können Sie diesen Trick anwenden, aber Sie aktualisieren die ursprüngliche Tabelle anstelle der neuen Tabelle, so dass Sie den Trick mit dem Umbenennen nicht anwenden müssen...

1voto

Wie wäre es mit dieser Anfrage, die hoffentlich hilft?

DELETE FROM story_category LEFT JOIN (SELECT category.id FROM category) cat ON story_category.id = cat.id WHERE cat.id IS NULL

0 Stimmen

Das Ergebnis zeigt: ' #1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; lesen Sie im Handbuch zu Ihrer MariaDB-Server-Version nach, um die richtige Syntax zu verwenden, und zwar bei 'LEFT JOIN (SELECT categories.id FROM categories) cat ON story_category.id = cat.' in Zeile 1 '

0 Stimmen

Wenn Sie das Löschen mehrerer Tabellen verwenden, müssen Sie die betroffenen Tabellen angeben. DELETE story_category FROM ... Die verknüpfte Unterabfrage ist in diesem Zusammenhang jedoch nicht erforderlich und kann mit LEFT JOIN category AS cat ON cat.id = story_category.category_id WHERE cat.id IS NULL Beachten Sie, dass die Verknüpfungskriterien in der Antwort fälschlicherweise auf story_category.id = cat.id

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X