2008-10-06 19 views

Respuesta

37

Para MySQL, no hay ninguno:MySQL Feature Request.

Permitir que esto sea posiblemente una muy mala idea, de todos modos: IF EXISTS indica que está ejecutando operaciones destructivas en una base de datos con (para usted) estructura desconocida. Puede haber situaciones en las que esto sea aceptable para el trabajo local rápido y sucio, pero si tiene la tentación de ejecutar una declaración de este tipo contra datos de producción (en una migración, etc.), está jugando con fuego.

Pero si insistes, no es difícil simplemente verificar la existencia primero en el cliente o detectar el error.

MariaDB también admite las siguientes comenzando con 10.0.2:

DROP [COLUMNA] [IF EXISTS] col_name

i. mi.

ALTER TABLE my_table DROP IF EXISTS my_column;

Pero podría decirse que es una mala idea confiar en una característica no estándar respaldada solo por una de varias versiones de MySQL.

+7

¿Hay alguna manera de hacerlo en SQL puro? – Tom

+7

Wow. Mencionado en 2005 - hace 9 años. Supongo que esta es la lista de prioridades ... – crmpicco

+3

MariaDB lo admite a partir de 10.0.2 – Dfr

40

No hay soporte de nivel de idioma para esto en MySQL. Aquí hay una solución temporal que involucra los metadatos MySQL information_schema en 5.0+, pero no abordará su problema en 4.0.18.

drop procedure if exists schema_change; 

delimiter ';;' 
create procedure schema_change() begin 

    /* delete columns if they exist */ 
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column1') then 
     alter table table1 drop column `column1`; 
    end if; 
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column2') then 
     alter table table1 drop column `column2`; 
    end if; 

    /* add columns */ 
    alter table table1 add column `column1` varchar(255) NULL; 
    alter table table1 add column `column2` varchar(255) NULL; 

end;; 

delimiter ';' 
call schema_change(); 

drop procedure if exists schema_change; 

Escribí información más detallada en un blog post.

+3

Pensé que era importante resumir la contribución de DrHyde como comentario, porque no es evidente cuando se trata de una respuesta propia. Asegúrese de verificar que su no modificar una base de datos diferente: SELECT * FROM INFORMATION_SCHEMA.COLUMNS DONDE nombre_tabla = "país" y nombre_columna = "updated_at" Y esquema_tabla = BASE DE DATOS() \ G – Homer6

+0

Si no quieren para recibir advertencias de "drop procedure if exists schema_change;" agregar "set sql_notes = 0;" antes de la primera línea y agrega "set sql_notes = 1;" después de la última línea. Detalles -> http://stackoverflow.com/questions/27616564/suppress-mysql-warnings – csonuryilmaz

5

obras respuesta de Chase Seibert, pero me gustaría añadir que si tiene varios esquemas que desee alterar la SELECT así:

select * from information_schema.columns where table_schema in (select schema()) and table_name=... 
-1

Soy consciente de este hilo es bastante viejo ahora, pero yo estaba teniendo el mismo problema. Esta fue mi solución básica con MySQL Workbench, pero funcionó bien ...

  1. conseguir un nuevo editor de SQL y ejecutar SHOW TABLES para obtener una lista de las tablas
  2. seleccionar todas las filas, y elija copiar al portapapeles (sin comillas) en el menú contextual
  3. pegar la lista de nombres en otra pestaña del editor
  4. escriba su consulta, es decir, ALTER TABLE x DROP a;
  5. hacer algo de copiar y pegar, por lo que terminan con la consulta independiente para cada tabla
  6. Toggle si el banco de trabajo debe detenerse cuando se produce un error
  7. Hit ejecutar y mirar a través del registro de salida

cualquier mesas que tenían la mesa ahora tienes no cualquier tabla de los cuales no se han mostrado un error en los registros

entonces usted puede encontrar/reemplazar 'drop a' cambiarlo a 'agregar la columna NULL b INT' etc una d ejecutar todo de nuevo ....

un poco torpe, pero al final obtienes el resultado final y puedes controlar/controlar todo el proceso y recuerda guardar tus scripts sql en caso de que los necesites nuevamente.

4

Sé que este es un hilo antiguo, pero hay una manera simple de manejar este requisito sin utilizar procedimientos almacenados. Esto puede ayudar a alguien.

set @exist_Check := (
    select count(*) from information_schema.columns 
    where TABLE_NAME='YOUR_TABLE' 
    and COLUMN_NAME='YOUR_COLUMN' 
    and TABLE_SCHEMA=database() 
) ; 
set @sqlstmt := if(@exist_Check>0,'alter table YOUR_TABLE drop column YOUR_COLUMN', 'select ''''') ; 
prepare stmt from @sqlstmt ; 
execute stmt ; 

Espero que esto ayude a alguien, como a mí (después de mucho ensayo y error).

+0

¡sí! Me ayudó mucho hoy. Gracias. –

Cuestiones relacionadas