MySQL ALTERSATESS语法,如果列存在,则删除它

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

如果MySQL表中的列存在于4.0.18版本上,那么该列的语法是什么?

提问于
用户回答回答于

对于MySQL,没有:MySQL特性请求...

无论如何,允许这样做是一个非常糟糕的主意:IF EXISTS指示您在结构未知的数据库上运行破坏性操作。在某些情况下,这对于快速和肮脏的本地工作来说是可以接受的,但是如果您想针对生产数据运行这样的语句(在迁移中等等),那么您就是在玩火。

但是,如果坚持,简单地首先检查客户端是否存在,或者发现错误并不困难。

MariaDB还支持从10.0.2开始的以下内容:

DROP [COLUMN] [IF EXISTS] col_name

那就是

ALTER TABLE my_table DROP IF EXISTS my_column;

但是,可以说,依赖于仅由MySQL的几个分支之一支持的非标准特性是个坏主意。

用户回答回答于

MySQL中没有对此的语言级别支持。这里有一个涉及mysql信息的解决方案。_模式元-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;

扫码关注云+社区