首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果列存在于MySQL中,则使用ALTER删除该列

如果列存在于MySQL中,则使用ALTER删除该列
EN

Stack Overflow用户
提问于 2008-10-06 10:29:16
回答 5查看 132.8K关注 0票数 108

如果MySQL表中的列存在,如何使用ALTER删除该列?

我知道我可以使用ALTER TABLE my_table DROP COLUMN my_column,但是如果my_column不存在,就会抛出一个错误。有没有其他语法可以有条件地删除该列?

我使用的是MySQL版本4.0.18。

EN

回答 5

Stack Overflow用户

发布于 2010-01-23 04:57:04

在MySQL中没有对此的语言级别支持。这里有一个在5.0+中涉及MySQL information_schema元数据的变通方法,但它不会在4.0.18中解决您的问题。

代码语言:javascript
复制
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中写了一些更详细的信息。

票数 45
EN

Stack Overflow用户

发布于 2017-08-04 19:40:42

我知道这是一个很老的线程,但是有一种简单的方法可以在不使用存储过程的情况下处理这个需求。这可能会对某些人有所帮助。

代码语言:javascript
复制
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 ;

希望这对某人有帮助,就像它对我一样(在经历了许多试验和错误之后)。

票数 19
EN

Stack Overflow用户

发布于 2018-04-05 23:37:56

我刚刚构建了一个可重用的过程,它可以帮助使DROP COLUMN幂等:

代码语言:javascript
复制
-- 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 ;

用法:

代码语言:javascript
复制
CALL drop_column_if_exists('my_table', 'my_column');

示例:

代码语言:javascript
复制
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
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/173814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档