Estoy tratando de crear una columna para mi tabla solo si no existe. He investigado mucho pero aún no he encontrado ninguna solución.
¿Es realmente posible crear condicionalmente una columna?
Estoy tratando de crear una columna para mi tabla solo si no existe. He investigado mucho pero aún no he encontrado ninguna solución.
¿Es realmente posible crear condicionalmente una columna?
Respuestas:
MySQL ALTER TABLE
no tiene IF EXISTS
especificación.
Puede hacer lo siguiente mediante el uso de un proceso almacenado o un lenguaje de programación si esto es algo que deberá hacer de manera regular:
Pseudocódigo:
Encuentre si la columna existe usando el SQL a continuación:
SELECT column_name
DE INFORMATION_SCHEMA
. COLUMNS
WHERE TABLE_SCHEMA
= [Nombre de la base de datos] AND TABLE_NAME
= [Nombre de la tabla];
Si la consulta anterior devuelve un resultado, significa que la columna existe, de lo contrario, puede continuar y crear la columna.
column_name
no existe. Reformulé la consulta a: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]'
Actualmente existe para Maria DB 10.219
ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);
Bono, también funciona para MODIFICAR
ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Puede usar esta solución, ya mencionada en otra publicación de StackOverFlow: (Ref .: https://stackoverflow.com/a/31989541/ )
MySQL - ALTER TABLE para agregar una columna si no existe:
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;
Esto a continuación funcionó para mí:
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;