Ich habe einen Tischlehrer und möchte die Datensätze löschen, deren Gehalt in einem Bereich liegt. Eine intuitive Methode ist wie folgt:
delete from instructor where salary between 13000 and 15000;
Im abgesicherten Modus kann ich einen Datensatz jedoch nicht löschen, ohne einen Primärschlüssel (ID) anzugeben.
Also schreibe ich folgendes SQL:
delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
Es liegt jedoch ein Fehler vor:
You can't specify target table 'instructor' for update in FROM clause
Ich bin verwirrt, weil wenn ich schreibe
select * from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
es erzeugt keinen Fehler.
Meine Frage ist:
- Was bedeutet diese Fehlermeldung wirklich und warum ist mein Code falsch?
- Wie schreibe ich diesen Code neu, damit er im abgesicherten Modus funktioniert?
Vielen Dank!
Antworten:
Beim Googeln scheint die beliebte Antwort " Schalten Sie einfach den abgesicherten Modus aus" zu sein :
Wenn ich ehrlich bin, kann ich nicht sagen, dass ich es mir jemals zur Gewohnheit gemacht habe, im abgesicherten Modus zu laufen. Trotzdem bin ich mit dieser Antwort nicht ganz zufrieden, da nur davon ausgegangen wird, dass Sie Ihre Datenbankkonfiguration jedes Mal ändern sollten, wenn Sie auf ein Problem stoßen.
Ihre zweite Abfrage befindet sich also näher an der Marke, stößt jedoch auf ein anderes Problem: MySQL wendet einige Einschränkungen auf Unterabfragen an. Eine davon ist, dass Sie eine Tabelle nicht ändern können, während Sie sie in einer Unterabfrage auswählen.
Zitat aus dem MySQL-Handbuch, Einschränkungen für Unterabfragen :
Das letzte bisschen ist deine Antwort. Wählen Sie Ziel-IDs in einer temporären Tabelle aus und löschen Sie sie, indem Sie auf die IDs in dieser Tabelle verweisen:
SQLFiddle-Demo .
quelle
ID
, während meine Antwort verwendetid
.Sie können MySQL dazu verleiten, zu glauben, dass Sie tatsächlich eine Primärschlüsselspalte angeben. Auf diese Weise können Sie den abgesicherten Modus "überschreiben".
Angenommen, Sie haben eine Tabelle mit einem automatisch inkrementierenden numerischen Primärschlüssel, können Sie Folgendes tun:
quelle
Deaktivieren des abgesicherten Modus in der MySQL-Workbench 6.3.4.0
Menü Bearbeiten => Einstellungen => SQL-Editor: Anderer Abschnitt: Klicken Sie auf "Sichere Updates" ..., um die Option zu deaktivieren
quelle
Ich habe eine viel einfachere Lösung, sie funktioniert für mich. Es ist auch eine Problemumgehung, kann aber verwendet werden und Sie müssen Ihre Einstellungen nicht ändern. Ich gehe davon aus, dass Sie einen Wert verwenden können, der niemals vorhanden sein wird, und ihn dann in Ihrer WHERE-Klausel verwenden
DELETE FROM MyTable WHERE MyField IS_NOT_EQUAL AnyValueNoItemOnMyFieldWillEverHave
Ich mag diese Lösung auch nicht so sehr, deshalb bin ich hier, aber sie funktioniert und es scheint besser zu sein als das, was beantwortet wurde
quelle