Using ALTER to drop a column if it exists in MySQL

后端 未结 8 1905
别跟我提以往
别跟我提以往 2020-11-29 02:57

How can ALTER be used to drop a column in a MySQL table if that column exists?

I know I can use ALTER TABLE my_table DROP COLUMN my_column, but that wi

8条回答
  •  一个人的身影
    2020-11-29 03:50

    I just built a reusable procedure that can help making DROP COLUMN idempotent:

    -- 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 ;
    

    Usage:

    CALL drop_column_if_exists('my_table', 'my_column');
    

    Example:

    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
    

提交回复
热议问题