很多时候只有自己遇到了问题才会着手去解决,这次刚好遇到了Mysql检查列是否存在的问题,顺便看到了网上其他大神也遇到过该问题就当作经验自己积累下来吧。
在MYSQL中,新增、修改、删除列时不能进行IF EXISTS判断,IF语句只能出现在存储过程当中,故博主用存储过程的方法新增、修改、删除列,修改列名称。
DROP PROCEDURE IF EXISTS Pro_ColumnWork;DELIMITER$$-- 1表示新增列,2表示修改列类型,3表示修改列名称,4表示删除列CREATE PROCEDURE Pro_ColumnWork(TableName VARCHAR(50),ColumnName VARCHAR(50),CType INT,SqlStr VARCHAR(4000))BEGINDECLARE Rows1 INT;SET Rows1=0;SELECT COUNT(*) INTO Rows1 FROM INFORMATION_SCHEMA.ColumnsWHERE table_schema= DATABASE() AND table_name=TableName AND column_name=ColumnName;-- 新增列IF (CType=1 AND Rows1<=0) THENSET SqlStr := CONCAT( 'ALTER TABLE ',TableName,' ADD COLUMN ',ColumnName,' ',SqlStr);-- 修改列类型ELSEIF (CType=2 AND Rows1>0) THENSET SqlStr := CONCAT('ALTER TABLE ',TableName,' MODIFY ',ColumnName,' ',SqlStr);-- 修改列名称ELSEIF (CType=3 AND Rows1>0) THENSET SqlStr := CONCAT('ALTER TABLE ',TableName,' CHANGE ',ColumnName,' ',SqlStr);-- 删除列ELSEIF (CType=4 AND Rows1>0) THENSET SqlStr := CONCAT('ALTER TABLE ',TableName,' DROP COLUMN ',ColumnName);ELSE SET SqlStr :='';END IF;-- 执行命令IF (SqlStr<>'') THEN SET @SQL1 = SqlStr;PREPARE stmt1 FROM @SQL1; EXECUTE stmt1;END IF;END$$DELIMITER ;-- CALL Pro_ColumnWork ('BaseInfo','Name2',4,'VARCHAR(50)');-- CALL Pro_ColumnWork ('BaseInfo','Abc',4,'VARCHAR(30)');
Mysql没有直接的语法可以在增加列前进行判断该列是否存在,需要写一个存储过程完成同样任务,下面例子是:在iyb_ha_category_campaign 表中增加一列company_id列 :
CREATE PROCEDURE add_column() BEGINIF EXISTS(SELECT1FROMinformation_schema.`COLUMNS`WHERE`TABLE_SCHEMA` = 'broker_00'AND `TABLE_NAME` = 'iyb_ha_category_campaign'AND `COLUMN_NAME` = 'company_id')THENALTER TABLE `broker_00`.`iyb_ha_category_campaign` DROP COLUMN `company_id`; END IF;ALTER TABLE `broker_00`.`iyb_ha_category_campaign`ADD COLUMN `company_id` varchar(50) CHARACTER SET utf8 NULL DEFAULT null COMMENT '关联顶级公司id' AFTER `campaign_id`;END;CALL add_column(); -- 执行该存储过程DROP PROCEDURE IF EXISTS add_column;