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ę?
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ę?
Odpowiedzi:
MySQL ALTER TABLE
nie ma IF EXISTS
specyfikacji.
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ę.
column_name
nie 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]';
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
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);
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;
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;