Estou tentando criar uma coluna para minha tabela somente se ela não existir. Pesquisei bastante, mas ainda não encontrei nenhuma solução.
É realmente possível criar uma coluna condicionalmente?
Estou tentando criar uma coluna para minha tabela somente se ela não existir. Pesquisei bastante, mas ainda não encontrei nenhuma solução.
É realmente possível criar uma coluna condicionalmente?
Respostas:
O MySQL ALTER TABLE
não possui IF EXISTS
especificação.
Você pode fazer o seguinte usando um processo armazenado ou uma linguagem de programação, se isso for algo que você precisará fazer regularmente:
Pseudo-código:
Descubra se a coluna existe usando o SQL abaixo:
SELECIONE column_name
DE INFORMATION_SCHEMA
. COLUMNS
WHERE TABLE_SCHEMA
= [Nome do banco de dados] AND TABLE_NAME
= [Nome da tabela];
Se a consulta acima retornar um resultado, significa que a coluna existe; caso contrário, você poderá prosseguir e criar a coluna.
column_name
não existe. Reformulei a consulta para: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]'
Atualmente existe atualmente para Maria DB 10.219
ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);
Bônus, funciona também para MODIFY
ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Você pode usar esta solução, já mencionada em outra publicação StackOverFlow: (Ref .: https://stackoverflow.com/a/31989541/ )
MySQL - ALTER TABLE para adicionar uma coluna se ela não existir:
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;
Isso abaixo funcionou para mim:
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;