MySQL: ¿Cómo crear una columna si no existe?


13

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?


Tengo curiosidad ... ¿Qué hay de malo en dejar que la alteración falle por error si la columna ya existe?
Derek Downey el

En realidad, necesito proporcionar un archivo .sql a mi cliente que tenga todas las consultas relacionadas con los cambios en la estructura de la base de datos. No puedo enviarles toda la base de datos. Solo quiero enviarles cambios db. hay muchas más consultas en ese archivo sql. Si esta consulta sobre la creación de columnas fallara, entonces fallarían todas las consultas. Por eso quiero usar la condición if para crear una columna.
zzzzz

Si su base de datos lo admite, podría usar un disparador. ANTES DE INSERTAR.
cybernard

Respuestas:


7

MySQL ALTER TABLEno tiene IF EXISTSespecificació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.


En MySQL / MariaDB recibo un error al usar esa consulta, indicando que column_nameno 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]';
Jesus Alonso Abad

2
Para una simple respuesta 0 o 1 en MySQL y (creo) MariaDB:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo

13

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);

3
> "MYSQL 5.5.5"? Esto no es correcto, esta es solo una característica de Maria DB.
Excalibur

1
gracias por la corrección
Paroofkey

6

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;

2

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;

Fui con este, gracias.
Stuart McIntyre
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.