Как можно использовать ALTER для удаления столбца в таблице MySQL, если этот столбец существует?
Я знаю, что могу использовать ALTER TABLE my_table DROP COLUMN my_column
, но это вызовет ошибку, если my_column
его не существует. Есть ли альтернативный синтаксис для условного удаления столбца?
Я использую MySQL версии 4.0.18.
Ответы:
Для 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.
источник
В 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;
Я написал более подробную информацию в блоге .
источник
Я знаю, что это старый поток, но есть простой способ выполнить это требование без использования хранимых процедур. Это может кому-то помочь.
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 ;
Надеюсь, это поможет кому-то, как и мне (после многих проб и ошибок).
источник
Я только что создал многоразовую процедуру, которая может помочь сделать
DROP COLUMN
идемпотент:-- column_exists: DROP FUNCTION IF EXISTS column_exists; DELIMITER $$ CREATE FUNCTION column_exists( tname VARCHAR(64), cname VARCHAR(64) ) RETURNS BOOLEAN READS SQL DATA BEGIN RETURN 0 < (SELECT COUNT(*) FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = SCHEMA() AND `TABLE_NAME` = tname AND `COLUMN_NAME` = cname); END $$ DELIMITER ; -- drop_column_if_exists: DROP PROCEDURE IF EXISTS drop_column_if_exists; DELIMITER $$ CREATE PROCEDURE drop_column_if_exists( tname VARCHAR(64), cname VARCHAR(64) ) BEGIN IF column_exists(tname, cname) THEN SET @drop_column_if_exists = CONCAT('ALTER TABLE `', tname, '` DROP COLUMN `', cname, '`'); PREPARE drop_query FROM @drop_column_if_exists; EXECUTE drop_query; END IF; END $$ DELIMITER ;
Применение:
CALL drop_column_if_exists('my_table', 'my_column');
Пример:
SELECT column_exists('my_table', 'my_column'); -- 1 CALL drop_column_if_exists('my_table', 'my_column'); -- success SELECT column_exists('my_table', 'my_column'); -- 0 CALL drop_column_if_exists('my_table', 'my_column'); -- success SELECT column_exists('my_table', 'my_column'); -- 0
источник
Ответ Чейза Зайберта работает, но я бы добавил, что если у вас есть несколько схем, вы хотите изменить SELECT следующим образом:
select * from information_schema.columns where table_schema in (select schema()) and table_name=...
источник
Возможно, самый простой способ решить эту проблему (который будет работать):
СОЗДАТЬ новую_таблицу КАК ВЫБРАТЬ id, col1, col2, ... (только те столбцы, которые вам действительно нужны в конечной таблице) FROM my_table;
ПЕРЕИМЕНОВАТЬ my_table в old_table, new_table TO my_table;
DROP old_table;
Или оставьте old_table для отката при необходимости.
Это будет работать, но внешние ключи не будут перемещены. Позже вам придется повторно добавить их в my_table; также внешние ключи в других таблицах, которые ссылаются на my_table, должны быть исправлены (указываются на новую my_table).
Удачи...
источник
Вы можете использовать этот скрипт, использовать свой столбец, схему и имя таблицы
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName' AND TABLE_SCHEMA = SchemaName) BEGIN ALTER TABLE TableName DROP COLUMN ColumnName; END;
источник
Я понимаю, что эта ветка сейчас довольно старая, но у меня была та же проблема. Это было мое очень простое решение с использованием MySQL Workbench, но оно работало нормально ...
x
DROPa
;любые таблицы, в которых была таблица, теперь не имеют таблиц, которые не отображали бы ошибку в журналах
тогда вы можете найти / заменить 'drop
a
' измените его на 'ADD COLUMNb
INT NULL' и т.д. и снова запустить все это ....немного неуклюже, но, наконец, вы получаете конечный результат, и вы можете контролировать / отслеживать весь процесс и не забывать сохранять свои sql-скрипты на случай, если они вам снова понадобятся.
источник