MySQL: Jak utworzyć kolumnę, jeśli nie istnieje?

14

Próbuję utworzyć kolumnę dla mojej tabeli tylko wtedy, gdy ona nie istnieje. Dużo badałem, ale nie znalazłem jeszcze żadnego rozwiązania.

Czy naprawdę można warunkowo utworzyć kolumnę?

zzzzz
źródło
Jestem ciekawy ... Co jest złego w tym, że modyfikacja kończy się błędem, jeśli kolumna już istnieje?
Derek Downey,
Właściwie muszę dostarczyć plik .sql do mojego klienta, który zawierałby wszystkie zapytania związane ze zmianami struktury DB. Nie mogę wysłać całej bazy danych. Chcę tylko wysłać im zmiany db. w tym pliku sql znajduje się o wiele więcej zapytań. Jeśli to zapytanie dotyczące tworzenia kolumn nie powiedzie się, nie powiedzie się wszystkie zapytania. Dlatego właśnie chcę użyć warunku do utworzenia kolumny.
zzzzz,
Jeśli baza danych obsługuje tę funkcję, możesz użyć wyzwalacza. PRZED WPROWADZENIEM.
cybernard

Odpowiedzi:

8

MySQL ALTER TABLEnie ma IF EXISTSspecyfikacji.

Możesz wykonać następujące czynności, korzystając z zapisanego proc lub języka programowania, jeśli jest to coś, co musisz robić regularnie:

Pseudo kod:

  • Sprawdź, czy kolumna istnieje, używając poniższego kodu SQL:

    SELECT column_name FROM INFORMATION_SCHEMA. COLUMNS GDZIE TABLE_SCHEMA= [nazwa bazy danych] ORAZ TABLE_NAME= [nazwa tabeli];

  • Jeśli powyższe zapytanie zwraca wynik, oznacza to, że kolumna istnieje, w przeciwnym razie możesz przejść dalej i utworzyć kolumnę.

thatsaru
źródło
W MySQL / MariaDB pojawia się błąd przy użyciu tego zapytania, stwierdzając, że column_namenie istnieje. Przeformułowałem zapytanie w następujący sposób:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
Jesus Alonso Abad
2
Dla prostej odpowiedzi 0 lub 1 zarówno w MySQL, jak i (jak sądzę) MariaDB:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo,
14

W rzeczywistości istnieje teraz dla Maria DB 10.219

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

Bonus, działa również dla MODIFY

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Paroofkey
źródło
3
> „MYSQL 5.5.5”? To nie jest poprawne, jest to tylko funkcja Maria DB.
Excalibur,
1
dzięki za korektę
Paroofkey
6

Możesz użyć tego rozwiązania, wspomnianego już w innym wpisie StackOverFlow: (zob .: https://stackoverflow.com/a/31989541/ )

MySQL - ALTER TABLE, aby dodać kolumnę, jeśli nie istnieje:

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;
Anto Jose
źródło
2

To poniżej działało dla mnie:

    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;
Tejpal Sharma
źródło
Poszedłem z tym, dzięki.
Stuart McIntyre