Wenn eine Tabelle vorhanden ist, erstellen Sie sie. Wenn sie nicht vorhanden ist, erstellen Sie sie einfach

151

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

George
quelle
@ Shomz, das wollten sie. Das Vorhandensein dieser Frage und die 20.000 Aufrufe dieser Seite beweisen jedoch, dass dies ungefähr so ​​einfach ist, wie das Englische ins Griechische umzuwandeln.
Pacerier
2
@ Pacerier Konnte nicht mehr zustimmen : διαγραφή πίνακα, εφόσον υπάρχει.
Shomz
@ Shomz, es gibt einen Grammatikfehler.
Pacerier

Antworten:

297

Stellen DROP TABLE IF EXISTS `tablename`;Sie einfach vor Ihre CREATE TABLEAussage.

Diese Anweisung löscht die Tabelle, falls vorhanden, gibt jedoch keinen Fehler aus, wenn dies nicht der Fall ist.

G-Nugget
quelle
1
Vielen Dank! Dies funktioniert auch für eine Liste von Tabellen oder Ansichten! DROP TABLE IF EXISTS 'table1', 'table2';und DROP VIEW IF EXISTS 'view1', 'view2';PS: Welche Hexerei hast du benutzt, um `s im Inline-Code zu haben?
Campbeln
2
@Campbeln Verdoppeln Sie einfach die Backticks vor und nach dem Codesegment. Einzelne Backticks werden dann wörtlich angezeigt.
r3mainer
43

Verwenden Sie einfach DROP TABLE IF EXISTS:

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

Durchsuchen Sie zuerst die MySQL-Dokumentation, wenn Sie andere Probleme haben.

r3mainer
quelle
8

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 TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
  • Sie sollten das Ergebnis von überprüfen 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.
  • Dann sollten Sie das Ergebnis von first überprüfen RENAME ...und im Erfolgsfall nicht fortfahren : Der gesamte Vorgang ist erfolgreich abgeschlossen; Darüber hinaus RENAME ...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).
  • Zweitens RENAME ...ersetzt atomar die Tabellendefinition. Weitere Informationen finden Sie im MySQL-Handbuch .
  • Endlich 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 TABLEnur Transformationen in CREATE/DROP VIEWwhile geändert, während sie RENAME TABLEunverändert bleiben. Sie können sogar den Tisch in eine Ansicht verwandeln und umgekehrt.

CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;

Randnotiz 2: MariaDB-Benutzer sollten zufrieden sein CREATE OR REPLACE TABLE/VIEW, was sich bereits um das Thema und die Feinheiten kümmert.

Alex Offshore
quelle
1

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:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

Das obige hat bei mir mit MySQL MariaDb funktioniert.

Sirskoy
quelle
drop table table_name; Tabelle als Auswahl * aus der Ansicht erstellen;
Sirskoy
Wenn Sie auf MariaDB sind (MySQL fehlt dies), dann können Sie einfachCREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore