Ich versuche, eine Abfrage zu schreiben, die überprüft, ob eine bestimmte Tabelle in MySQL eine bestimmte Spalte enthält, und wenn nicht, erstellen Sie sie. Sonst nichts tun. Dies ist wirklich eine einfache Prozedur in jeder Datenbank der Enterprise-Klasse, aber MySQL scheint eine Ausnahme zu sein.
Ich dachte so etwas
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update')
BEGIN
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;
würde funktionieren, aber es scheitert schlecht. Gibt es einen Weg?
Antworten:
Das funktioniert gut für mich.
Mit PHP wäre es so etwas wie ...
quelle
@ Julio
Vielen Dank für das SQL-Beispiel. Ich habe die Abfrage ausprobiert und denke, dass eine kleine Änderung erforderlich ist, damit sie ordnungsgemäß funktioniert.
Das hat bei mir funktioniert.
Vielen Dank!
quelle
IF
usw. zulässt. Ein Beispiel für das Umschließen einer Prozedur finden Sie unter stackoverflow.com/questions/7384711/… der Test für die Spalte und die bedingte DML-Anweisung.Versuchen Sie etwas wie, um jedem zu helfen, der nach einem konkreten Beispiel für die Beschreibung von @Mchl sucht
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Wenn false zurückgegeben wird (keine Ergebnisse), wissen Sie, dass die Spalte nicht vorhanden ist.
quelle
TABLE_NAME = 'my_table'
, TABLE_SCHEMA ist das Schema, in dem sich die Tabelle befindet.SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Das Folgende ist eine andere Möglichkeit, dies mit einfachem PHP ohne die Datenbank information_schema zu tun:
quelle
isset()
würde 'false' auslösen, wenn der Array-Schlüssel vorhanden ist, der Wert jedoch NULL ist . Es ist besser,array_key_exists()
wie zu verwendenif( !array_key_exists( 'my_new_column', $mycol ) )
isset()
Scheck übersah . Es löst die Frage nicht, aber es ist besser, wenn Sie die Auswahlabfrage bereits ausführen müssen und das Ergebnis im Speicher haben.Ich habe diese gespeicherte Prozedur zusammen mit einem Anfang von @ lains obigen Kommentaren geworfen, ein bisschen nett, wenn Sie sie mehr als ein paar Mal aufrufen müssen (und kein PHP benötigen):
Arbeiten mit
fieldExists
quelle
ExpirationDate
Feld vorhanden ist. 😊Wählen Sie nur Spaltenname aus dem Informationsschema aus und fügen Sie das Ergebnis dieser Abfrage in eine Variable ein. Testen Sie dann die Variable, um zu entscheiden, ob die Tabelle geändert werden muss oder nicht.
PS Beschlagen Sie nicht, TABLE_SCHEMA auch für die Tabelle COLUMNS anzugeben.
quelle
Ich benutze dieses einfache Skript:
Es funktioniert, wenn Sie bereits mit der Datenbank verbunden sind.
quelle
Vielen Dank an Mfoo, der das wirklich schöne Skript zum dynamischen Hinzufügen von Spalten erstellt hat, wenn es nicht in der Tabelle vorhanden ist. Ich habe seine Antwort mit PHP verbessert . Das Skript hilft Ihnen außerdem dabei, herauszufinden, wie viele Tabellen tatsächlich den MySQL - Befehl 'Spalte hinzufügen ' benötigen. Probieren Sie einfach das Rezept. Funktioniert wie Charme.
quelle
Diese Arbeit für mich mit Beispiel PDO:
quelle
Setzen Sie ALTER TABLE / MODIFY COLS oder andere solche Table Mod-Operationen NICHT in eine TRANSACTION ein. Transaktionen dienen dazu, einen QUERY-Fehler zurückzusetzen, nicht für ÄNDERUNGEN. Er tritt jedes Mal in einer Transaktion auf.
Führen Sie einfach eine SELECT * -Abfrage für die Tabelle aus und prüfen Sie, ob die Spalte vorhanden ist ...
quelle
ALTER
(und DDL so) in MySQL tatsächlich die Transaktion (implizit) festschreiben. Die Verwendung von SELECT * würde jedoch einen großen Overhead im Netzwerk erzeugen, wenn nur die Existenz der Spalte überprüft wird. Sie könnten stattdessen versuchenSELECT my_col_to_check FROM t LIMIT 0
: Wenn MySQL einen Fehler generiert, ist die Spalte wahrscheinlich nicht vorhanden (überprüfen Sie den Fehler dennoch, da es sich möglicherweise um ein Netzwerkproblem handelt oder was auch immer!). Wenn kein Fehler generiert wird, ist eine Spalte vorhanden. Ich bin mir nicht sicher, ob dies der beste Weg ist, um die Spaltenexistenz zu überprüfen.