2008-10-06 2 views

ответ

37

Для MySQL нет:MySQL Feature Request.

Разрешить это, возможно, очень плохая идея, так или иначе: IF EXISTS указывает, что вы запускаете деструктивные операции с базой данных с неизвестной структурой (для вас). Могут быть ситуации, когда это приемлемо для быстрой и грязной локальной работы, но если у вас возникает соблазн запустить такое заявление против производственных данных (при миграции и т. Д.), Вы играете с огнем.

Но если вы настаиваете, нетрудно просто проверить наличие на первом месте в клиенте или поймать ошибку.

MariaDB также поддерживает следующие начиная с 10.0.2:

DROP [COLUMN] [IF EXISTS] col_name

я. е.

ALTER TABLE my_table DROP IF EXISTS my_column;

Но, возможно, это плохая идея полагаться на нестандартную функцию, поддерживаемую только одной из нескольких вилок MySQL.

+7

Есть ли способ сделать это в чистом SQL? – Tom 2010-01-19 08:56:08

+7

Ничего себе. Упоминается в 2005 году - 9 лет назад. Я предполагаю, что это список приоритетов ... – crmpicco 2014-07-15 16:47:34

+3

MariaDB поддерживает его начиная с 10.0.2 – Dfr 2014-11-25 09:02:20

40

В MySQL нет поддержки на уровне языка. Ниже приведен пример работы с метаданными MySQL information_schema в версии 5.0+, но он не будет устранять проблему в 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; 

Я написал несколько более подробную информацию в blog post.

5

ответ работает Чейз Зайберт, но я хотел бы добавить, что если у вас есть несколько схем вы хотите изменить ВЫБРАТЬ таким образом:

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

Я понимаю, что эта нить довольно стар, но у меня был тот же проблема. Это было мое самое основное решение с помощью MySQL Workbench, но оно отлично работало ...

  1. получить новый редактор SQL и выполнить SHOW TABLES, чтобы получить список таблиц
  2. выбрать все строки, и выберите копирование в буфер обмена (без кавычек) из контекстного меню
  3. вставить список имена в другую вкладку редактора
  4. Напишите ваш запрос, например ALTER TABLE x DROP a;
  5. сделать некоторые копирования и вставки, так что вы в конечном итоге с отдельного запроса для каждой таблицы
  6. Тумблер следует ли верстак остановки при возникновении ошибки
  7. Хит выполнить и посмотреть журнал вывода

любой таблицы, которые имели таблицу теперь не никаких таблиц, которые не будут показаны ошибки в журналах

, то вы можете найти/заменить «падение a» изменить на «ADD COLUMN b INT NULL» и т.д. d снова запустите все это ...

Немного неудобно, но, наконец, вы получите конечный результат, и вы можете контролировать/контролировать весь процесс и не забывать сохранять ваши SQL-скрипты на случай, если они вам понадобятся.

4

Я знаю, что это старый поток, но есть простой способ справиться с этим требованием без использования хранимых процедур. Это может помочь кому-то.

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 ; 

Надеюсь, это поможет кому-то, как и мне (после большого количества проб и ошибок).

Смежные вопросы