Ich bin ratlos, ich weiß nicht, wie ich das machen soll.
Grundsätzlich möchte ich nur eine Tabelle erstellen, aber wenn sie vorhanden ist, muss sie gelöscht und neu erstellt werden, nicht abgeschnitten, aber wenn sie nicht vorhanden ist, erstellen Sie sie einfach.
Würde jemand helfen können?
Danke, George
διαγραφή πίνακα, εφόσον υπάρχει
.Antworten:
Stellen
DROP TABLE IF EXISTS `tablename`;
Sie einfach vor IhreCREATE TABLE
Aussage.Diese Anweisung löscht die Tabelle, falls vorhanden, gibt jedoch keinen Fehler aus, wenn dies nicht der Fall ist.
quelle
DROP TABLE IF EXISTS 'table1', 'table2';
undDROP VIEW IF EXISTS 'view1', 'view2';
PS: Welche Hexerei hast du benutzt, um `s im Inline-Code zu haben?Verwenden Sie einfach
DROP TABLE IF EXISTS
:Durchsuchen Sie zuerst die MySQL-Dokumentation, wenn Sie andere Probleme haben.
quelle
Nun ... Huh. Jahrelang erwähnte niemand eine subtile Sache.
Obwohl dies
DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );
vernünftig erscheint, führt dies zu einer Situation, in der die alte Tabelle bereits verschwunden ist und noch keine neue erstellt wurde: Einige Clients versuchen möglicherweise gerade, auf die betreffende Tabelle zuzugreifen.Der bessere Weg ist, eine brandneue Tabelle zu erstellen und diese gegen eine alte auszutauschen (der Inhalt der Tabelle geht verloren):
CREATE ...
und im Fehlerfall nicht fortfahren , da ein Fehler bedeutet, dass ein anderer Thread nicht dasselbe Skript beendet hat: entweder weil er in der Mitte abgestürzt ist oder nur noch nicht beendet wurde - das ist eine gute Idee Inspizieren Sie die Dinge selbst.RENAME ...
und im Erfolgsfall nicht fortfahren : Der gesamte Vorgang ist erfolgreich abgeschlossen; Darüber hinausRENAME ...
kann (und wird) das Ausführen von next unsicher sein, wenn ein anderer Thread bereits dieselbe Sequenz gestartet hat (es ist besser, diesen Fall abzudecken, als ihn nicht abzudecken, siehe Sperrhinweis unten).RENAME ...
ersetzt atomar die Tabellendefinition. Weitere Informationen finden Sie im MySQL-Handbuch .DROP ...
räumt natürlich nur der alte Tisch auf.Das Umschließen aller Anweisungen mit so etwas wie
SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');
ermöglicht es, alle Anweisungen nacheinander ohne Fehlerprüfung aufzurufen, aber ich halte dies nicht für eine gute Idee: Die Komplexität steigt und Sperrfunktionen in MySQL sind für die anweisungsbasierte Replikation nicht sicher.Wenn die Tabellendaten das Upgrade der Tabellendefinition überleben sollen ... Im Allgemeinen ist es weitaus komplexer, Tabellendefinitionen zu vergleichen, um Unterschiede herauszufinden und die richtige
ALTER ...
Anweisung zu erstellen , was nicht immer automatisch möglich ist, z. B. wenn Spalten umbenannt werden.Randnotiz 1: Sie können Ansichten mit demselben Ansatz behandeln. In diesem Fall werden
CREATE/DROP TABLE
nur Transformationen inCREATE/DROP VIEW
while geändert, während sieRENAME TABLE
unverändert bleiben. Sie können sogar den Tisch in eine Ansicht verwandeln und umgekehrt.Randnotiz 2: MariaDB-Benutzer sollten zufrieden sein
CREATE OR REPLACE TABLE/VIEW
, was sich bereits um das Thema und die Feinheiten kümmert.quelle
Ich musste eine Tabelle löschen und mit Daten aus einer Ansicht neu erstellen. Ich habe eine Tabelle aus einer Ansicht heraus erstellt und Folgendes getan:
Das obige hat bei mir mit MySQL MariaDb funktioniert.
quelle
CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;