MYSQL 安全添加/移除column 脚本

1. 如果不存在,就添加;

 用存储过程解决,定义成模板,可以通用;
 应用场景:必须拥有创建存储过程的权限
DELIMITER $$

USE `ebt_shop_test`$$
DROP PROCEDURE IF EXISTS `addFieldIfNotExists`$$
DROP FUNCTION IF EXISTS `isFieldExisting`$$

CREATE FUNCTION isFieldExisting (
 table_name_IN VARCHAR(100),
 field_name_IN VARCHAR(100)
 )
RETURNS INT
RETURN (
    SELECT COUNT(COLUMN_NAME)
    FROM INFORMATION_SCHEMA.columns
    WHERE TABLE_SCHEMA = DATABASE()
    AND TABLE_NAME = table_name_IN
    AND COLUMN_NAME = field_name_IN
)
$$

CREATE PROCEDURE addFieldIfNotExists (
 IN table_name_IN VARCHAR(100),
 IN field_name_IN VARCHAR(100),
 IN field_definition_IN VARCHAR(100)
 )
BEGIN
    SET @isFieldThere = isFieldExisting(table_name_IN, field_name_IN);    
    IF (@isFieldThere = 0) THEN  
        SET @ddl = CONCAT('ALTER TABLE ', table_name_IN);
        SET @ddl = CONCAT(@ddl, '', 'ADD COLUMN') ;
        SET @ddl = CONCAT(@ddl, '', field_name_IN);
        SET @ddl = CONCAT(@ddl, '', field_definition_IN);
        PREPARE stmt FROM @ddl;
       EXECUTE stmt;
       DEALLOCATE PREPARE stmt;
    END IF;
END$$

DELIMITER ;

【说明】使用了 “DELIMITER $$ … … DELIMITER ;” 分块语法,在此定义区域内的语句作为整体一并提交给服务器
调用添加列,例如:

-- call procedure add field if not exists

CALL addFieldIfNotExists ('dic_data', 'parentId', 'VARCHAR(50) NULL COMMENT \'父ID\'');

-- clean work
DROP PROCEDURE IF EXISTS `addFieldIfNotExists`;
DROP FUNCTION IF EXISTS `isFieldExisting`;

2.另一种方式: 如果不存在,就添加

如果没有权限创建函数和存储过程时,一种更直接的方式,直接写可执行的sql语句编译执行
应用场景:有受权限限制,每次都直接编写相应的SQL语句即可

SET @exeResult = (SELECT IF( (SELECT COUNT(*)
   FROM INFORMATION_SCHEMA.COLUMNS
   WHERE table_schema = DATABASE()
   AND table_name = 'dic_data'
   AND column_name = 'isLeaf1'
   ) > 0,
   'SELECT 1 AS RESULT',
   'alter table dic_data add column isLeaf1 char(1) COMMENT \'是否为叶子节点\' NULL after parentId'
     )
);
PREPARE stmt FROM @exeResult;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【语法解析】:
@exeResult: 临时变量定义的方式
IF(boolean表达式, param1,param2):相当于程序中的三元表达式
PREPARE :预编译SQL语句
EXECUTE :执行SQL语句
DEALLOCATE :清除预编译的语句
eg:

PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;
DEALLOCATE PREPARE stmt1;

3.安全地删除列,也可以先进行判断而后进行操作

SET @exeResult = (SELECT IF( (SELECT COUNT(*)
   FROM INFORMATION_SCHEMA.COLUMNS
   WHERE table_schema = DATABASE()
   AND table_name = 'dic_data'
   AND column_name = 'isLeaf1'
   ) > 0,
   'alter table dic_data drop column isLeaf1',
   'SELECT 0 AS RESULT'
     )
);
PREPARE stmt FROM @exeResult;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值