MySQL: Wie erstelle ich eine Spalte, wenn sie nicht existiert?


13

Ich versuche nur dann, eine Spalte für meine Tabelle zu erstellen, wenn diese nicht vorhanden ist. Ich habe viel recherchiert, konnte aber noch keine Lösung finden.

Ist es wirklich möglich, eine Spalte bedingt zu erstellen?


Ich bin neugierig ... Was ist falsch daran, die Änderung nur bei einem Fehler fehlschlagen zu lassen, wenn die Spalte bereits vorhanden ist?
Derek Downey

Eigentlich muss ich meinem Client eine SQL-Datei bereitstellen, die alle Abfragen im Zusammenhang mit Änderungen der DB-Struktur enthält. Ich kann ihnen nicht die ganze Datenbank senden. Ich möchte ihnen nur DB-Änderungen senden. Diese SQL-Datei enthält viele weitere Abfragen. Wenn diese Abfrage zum Erstellen von Spalten fehlschlägt, schlagen alle Abfragen fehl. Deshalb möchte ich if-Bedingung verwenden, um eine Spalte zu erstellen.
zzzzz

Wenn Ihre Datenbank dies unterstützt, können Sie einen Trigger verwenden. VOR EINFÜGEN.
Cybernard

Antworten:


7

MySQL ALTER TABLEhat keine IF EXISTSSpezifikation.

Sie können Folgendes mithilfe eines gespeicherten Prozesses oder einer Programmiersprache tun, wenn Sie dies regelmäßig tun müssen:

Pseudocode:

  • Finden Sie mithilfe der folgenden SQL heraus, ob die Spalte vorhanden ist:

    AUSWÄHLEN column_name VON INFORMATION_SCHEMA. COLUMNS WHERE TABLE_SCHEMA= [Datenbankname] AND TABLE_NAME= [Tabellenname];

  • Wenn die obige Abfrage ein Ergebnis zurückgibt, bedeutet dies, dass die Spalte vorhanden ist. Andernfalls können Sie die Spalte erstellen.


In MySQL / MariaDB wird bei Verwendung dieser Abfrage ein Fehler angezeigt, der besagt, dass dieser column_namenicht vorhanden ist. Ich formulierte die Anfrage neu zu:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
Jesus Alonso Abad

2
Für eine einfache 0 oder 1 Antwort auf MySQL und (glaube ich) MariaDB:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
Piojo

13

Existiert jetzt tatsächlich für Maria DB 10.219

ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);

Bonus, es funktioniert auch für MODIFY

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);

3
> "MYSQL 5.5.5"? Dies ist nicht korrekt, dies ist nur eine Maria DB-Funktion.
Excalibur

1
Danke für die Korrektur
Paroofkey

6

Sie können diese Lösung verwenden, die bereits in einem anderen StackOverFlow-Beitrag erwähnt wurde: (Ref.: Https://stackoverflow.com/a/31989541/ )

MySQL - ALTER TABLE, um eine Spalte hinzuzufügen, wenn sie nicht vorhanden ist:

SET @dbname = DATABASE();
SET @tablename = "tableName";
SET @columnname = "colName";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

1

Das unten hat bei mir funktioniert:

    SELECT count(*)
    INTO @exist
    FROM information_schema.columns
    WHERE table_schema = 'mydatabase'
    and COLUMN_NAME = 'mycolumn'
    AND table_name = 'mytable' LIMIT 1;

    set @query = IF(@exist <= 0, 'ALTER TABLE mydatabase.`mytable`  ADD COLUMN `mycolumn` MEDIUMTEXT NULL',
    'select \'Column Exists\' status');

    prepare stmt from @query;

    EXECUTE stmt;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.