在MYSQL中,新增、修改、删除列时不能进行IF EXISTS判断,IF语句只能出现在存储过程当中,故博主用存储过程的方法新增、修改、删除列,修改列名称。

  1. DROP PROCEDURE IF EXISTS Pro_ColumnWork;
  2. DELIMITER$$
  3. -- 1表示新增列,2表示修改列类型,3表示修改列名称,4表示删除列
  4. CREATE PROCEDURE Pro_ColumnWork(TableName VARCHAR(50),ColumnName VARCHAR(50),CType INT,SqlStr VARCHAR(4000))
  5. BEGIN
  6. DECLARE Rows1 INT;
  7. SET Rows1=0;
  8. SELECT COUNT(*) INTO Rows1 FROM INFORMATION_SCHEMA.Columns
  9. WHERE table_schema= DATABASE() AND table_name=TableName AND column_name=ColumnName;
  10. -- 新增列
  11. IF (CType=1 AND Rows1<=0) THEN
  12. SET SqlStr := CONCAT( 'ALTER TABLE ',TableName,' ADD COLUMN ',ColumnName,' ',SqlStr);
  13. -- 修改列类型
  14. ELSEIF (CType=2 AND Rows1>0) THEN
  15. SET SqlStr := CONCAT('ALTER TABLE ',TableName,' MODIFY ',ColumnName,' ',SqlStr);
  16. -- 修改列名称
  17. ELSEIF (CType=3 AND Rows1>0) THEN
  18. SET SqlStr := CONCAT('ALTER TABLE ',TableName,' CHANGE ',ColumnName,' ',SqlStr);
  19. -- 删除列
  20. ELSEIF (CType=4 AND Rows1>0) THEN
  21. SET SqlStr := CONCAT('ALTER TABLE ',TableName,' DROP COLUMN ',ColumnName);
  22. ELSE SET SqlStr :='';
  23. END IF;
  24. -- 执行命令
  25. IF (SqlStr<>'') THEN
  26. SET @SQL1 = SqlStr;
  27. PREPARE stmt1 FROM @SQL1;
  28. EXECUTE stmt1;
  29. END IF;
  30. END$$
  31. DELIMITER ;
  32.  
  33. -- CALL Pro_ColumnWork ('BaseInfo','Name2',4,'VARCHAR(50)');
  34. -- CALL Pro_ColumnWork ('BaseInfo','Abc',4,'VARCHAR(30)');

Mysql没有直接的语法可以在增加列前进行判断该列是否存在,需要写一个存储过程完成同样任务,

下面例子是:在T_DT_HOMEWORK表中增加一列RECOMMEND_RECORD列 :
  1. create procedure add_col_homework() BEGIN
  2. IF EXISTS (SELECT column_name FROM information_schema.columns WHERE column_name = 'T_DT_HOMEWORK' AND column_name = 'RECOMMEND_RECORD')
  3. THEN
  4. ALTER TABLE `T_DT_HOMEWORK` DROP COLUMN `RECOMMEND_RECORD`;
  5. END IF;
  6. ALTER TABLE `T_DT_HOMEWORK` ADD COLUMN `RECOMMEND_RECORD` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `RECOMMEND_ORG_CODE`;
  7. END;
  8.  
  9. drop procedure if exists add_col_homework;

sql语句:

  1. SELECT
  2. COLUMN_NAME,
  3. DATA_TYPE,
  4. IS_NULLABLE,
  5. COLUMN_DEFAULT
  6. FROM
  7. INFORMATION_SCHEMA.COLUMNS
  8. WHERE table_name = 'table_name'
  9. AND table_schema = 'database_name' ;
  10.  
  11. SELECT
  12. COUNT(COLUMN_NAME)
  13. FROM
  14. INFORMATION_SCHEMA.COLUMNS
  15. WHERE table_name = 'table_name'
  16. AND table_schema = 'database_name'
  17. AND COLUMN_NAME = 'column_name';


Mysql检查列是否存在并新增、修改、删除列的更多相关文章

  1. MySQL 添加列,修改列,删除列

    ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table ...

  2. mysql 增加列,修改列名、列属性,删除列语句

    mysql增加列,修改列名.列属性,删除列语句 mysql修改表名,列名,列类型,添加表列,删除表列     alter table test rename test1; --修改表名 alter t ...

  3. 如何把mysql的列修改成行显示数据简单实现

    如何把mysql的列修改成行显示数据简单实现 创建测试表: 1: DROP TABLE IF EXISTS `test`; 2: CREATE TABLE `test` ( 3: `year` int ...

  4. paip.解决 数据库mysql增加列 字段很慢添加字段很慢

    paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6    数据仅仅3w alter table xxx add column yyy int default ...

  5. Mysql EXPLAIN列的解释

    转自:http://blog.chinaunix.net/uid-540802-id-3419311.html explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择 ...

  6. 如何正确选择MySQL数据列类型

    MySQL数据列类型选择是在我们设计表的时候经常会遇到的问题,下面就教您如何正确选择MySQL数据列类型,供您参考学习. 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性.在选择MyS ...

  7. Mysql中用SQL增加、删除、修改(包括字段长度/注释/字段名)总结

    转: Mysql中用SQL增加.删除.修改(包括字段长度/注释/字段名)总结 2018年09月05日 10:14:37 桥Dopey 阅读数:1830   版权声明:本文为博主原创文章,未经博主允许不 ...

  8. Mysql的默认最大连接数及如何修改

    一.Mysql默认最大连接数 通过查看mysql安装目录的my.ini文件,发现mysql的默认最大的连接数为100,实际场景中,以及进行压测时,100时远远不够的,一般都会设置最大的连接数. 二.如 ...

  9. mysql 关于列的语句

    查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除 ...

随机推荐

  1. ubuntu14.04+安卓7.1(全志源码)+openjdk-8编译

    题记:编译花了将近4小时,所以编译源码是很费时的哦,可以在编译的时候可以学习其他的知识 编译环境准备 软件:WorkStation10 系统:ubuntu14.04 内存:8G 处理器:4个 磁盘大小 ...

  2. FTP\SFTP连接命令

    五.ftp连接     输入:ftp 10.18.49.19 2121六.输入账号密码  zhangsan/sdjg34t#七.输入:ls    查看文件是否上传       如上传 输入:bye   ...

  3. debain安装文泉驿字体

    sudo apt-get install ttf-wqy-microhei sudo apt-get install ttf-wqy-zenhei

  4. c++11实现线程池

    http://note.youdao.com/noteshare?id=de17ff681b277bb914ef46aeb9271fc4

  5. JS事件中级 --- 拖拽

    http://bbs.zhinengshe.com/thread-1200-1-1.html 要求:实现div块的拖拽 原理:拖拽过程中鼠标点和div块的相对位置保持不变. 需要理解三点: 1. 为什 ...

  6. mysql数据库为什么要分表和分区?

    一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片 ...

  7. Pytorch修改ResNet模型全连接层进行直接训练

    之前在用预训练的ResNet的模型进行迁移训练时,是固定除最后一层的前面层权重,然后把全连接层输出改为自己需要的数目,进行最后一层的训练,那么现在假如想要只是把 最后一层的输出改一下,不需要加载前面层 ...

  8. postman Tests断言

    摘要:关于postman的断言方法很多,在网上随便搜寻下,能搜出一大推,什么牛鬼蛇神都有,让人眼花缭乱..甚至在应用时出现错误.Test断言都是根据js规则来写的,对于我这种不懂js语言的来说确实不友 ...

  9. MVC、MVP、MVVM模式的概念与区别

    1. MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示 ...

  10. (转)Linux中显示空闲内存空间的free命令的基本用法

    这篇文章主要介绍了Linux系统中free命令的基本用法,用free命令查看内存空余信息是Linux系统入门学习中的基础知识,需要的朋友可以参考下   free 命令显示系统使用和空闲的内存情况,包括 ...