Wie kann ALTER verwendet werden, um eine Spalte in einer MySQL-Tabelle zu löschen, wenn diese Spalte vorhanden ist?
Ich weiß, dass ich verwenden kann ALTER TABLE my_table DROP COLUMN my_column
, aber das wird einen Fehler auslösen, wenn my_column
es nicht existiert. Gibt es eine alternative Syntax zum bedingten Löschen der Spalte?
Ich verwende MySQL Version 4.0.18.
Antworten:
Für MySQL gibt es keine: MySQL Feature Request .
Dies zuzulassen ist wohl sowieso eine wirklich schlechte Idee:
IF EXISTS
Zeigt an, dass Sie destruktive Operationen an einer Datenbank mit (Ihnen) unbekannter Struktur ausführen. Es kann Situationen geben, in denen dies für schnelle und schmutzige lokale Arbeiten akzeptabel ist. Wenn Sie jedoch versucht sind, eine solche Anweisung für Produktionsdaten (bei einer Migration usw.) auszuführen, spielen Sie mit dem Feuer.Wenn Sie jedoch darauf bestehen, ist es nicht schwierig, zuerst im Client auf Existenz zu prüfen oder den Fehler zu erkennen.
MariaDB unterstützt ab 10.0.2 auch Folgendes:
dh
Aber es ist wohl eine schlechte Idee, sich auf eine nicht standardmäßige Funktion zu verlassen, die nur von einer von mehreren Gabeln von MySQL unterstützt wird.
quelle
In MySQL gibt es dafür keine Unterstützung auf Sprachebene. Hier ist eine Problemumgehung mit MySQL information_schema-Metadaten in 5.0+, die Ihr Problem in 4.0.18 jedoch nicht behebt.
Ich habe einige detailliertere Informationen in einen Blog-Beitrag geschrieben .
quelle
Ich weiß, dass dies ein alter Thread ist, aber es gibt eine einfache Möglichkeit, diese Anforderung zu handhaben, ohne gespeicherte Prozeduren zu verwenden. Dies kann jemandem helfen.
Hoffe, das hilft jemandem, so wie ich (nach viel Versuch und Irrtum).
quelle
Ich habe gerade eine wiederverwendbare Prozedur erstellt, die dazu beitragen kann,
DROP COLUMN
idempotent zu machen:Verwendung:
Beispiel:
quelle
Die Antwort von Chase Seibert funktioniert, aber ich möchte hinzufügen, dass Sie, wenn Sie mehrere Schemata haben, das SELECT folgendermaßen ändern möchten:
quelle
Vielleicht ist der einfachste Weg, dies zu lösen (das wird funktionieren):
CREATE new_table AS SELECT id, col1, col2, ... (nur die Spalten, die Sie tatsächlich in der endgültigen Tabelle haben möchten) FROM my_table;
RENAME my_table TO old_table, new_table TO my_table;
DROP old_table;
Oder bewahren Sie old_table für einen Rollback auf, falls erforderlich.
Dies funktioniert, aber Fremdschlüssel werden nicht verschoben. Sie müssten sie später erneut zu my_table hinzufügen. Auch Fremdschlüssel in anderen Tabellen, die auf my_table verweisen, müssen repariert werden (auf die neue my_table verwiesen).
Viel Glück...
quelle
Sie können dieses Skript verwenden und Ihren Spalten-, Schema- und Tabellennamen verwenden
quelle
Mir ist klar, dass dieser Thread jetzt ziemlich alt ist, aber ich hatte das gleiche Problem. Dies war meine grundlegende Lösung mit der MySQL Workbench, aber es hat gut funktioniert ...
x
DROPa
;Alle Tabellen, die die Tabelle hatten, haben jetzt keine Tabellen, die keinen Fehler in den Protokollen angezeigt haben
dann können Sie 'drop
a
' finden / ersetzen, es in 'ADD COLUMNb
INT NULL' usw. ändern und das Ganze erneut ausführen ....ein bisschen klobig, aber endlich erhalten Sie das Endergebnis und können den gesamten Prozess steuern / überwachen und daran denken, Ihre SQL-Skripte zu speichern, falls Sie sie erneut benötigen.
quelle