一、information_schema数据库表说明:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。

TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。

COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

COLLATIONS表:提供了关于各字符集的对照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

KEY_COLUMN_USAGE表:描述了具有约束的键列。

ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

二、存储过程实现

思路:

1.先判断表是否存在;

2.判断列名是否存在该表中;

3.判断null、default是否存在属性中;

4.判断是否需要插入到某个列名之后;

5.拼装sql语句;

6.执行添加字段的sql语句;

 drop procedure if exists `AddColumnIfNotExists`;
delimiter $$
create procedure AddColumnIfNotExists(in tableName varchar(50),in columnName varchar(50),in discription varchar(256), in position varchar(50))
begin
declare tableCount int default 0; #用于判断表是否存在
declare columnCount int default 0; #用于判断字段是否存在
declare stmt varchar(2000); #最终拼接出来的sql语句
declare seat int default 0; #用于判断null/default的位置 SELECT count(*) into @tableCount FROM information_schema.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = tableName;
SELECT count(*) into @columnCount FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = tableName AND COLUMN_NAME = columnName; if @tableCount=1 && @columnCount=0 then
set @seat = locate('null', discription);
if @seat > 0 then #判断是否存在null
set @stmt = CONCAT(' ALTER TABLE `',tableName,'` ADD COLUMN `',columnName,'` ',discription);
else
set @seat = locate('default', discription);
if @seat > 0 then #判断是否存在default
set @stmt = CONCAT(' ALTER TABLE `',tableName,'` ADD COLUMN `',columnName,'` ',discription, ' NOT NULL');
else
set @stmt = CONCAT(' ALTER TABLE `',tableName,'` ADD COLUMN `',columnName,'` ',discription, ' NULL');
end if;
end if; if position != '' then #判断是否需要插入某个字段的后面
set @stmt = CONCAT(@stmt, ' after ', position, ';');
else
set @stmt = CONCAT(@stmt, ';');
end if; PREPARE stmt1 FROM @stmt;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
select @stmt;
end if;
end$$
delimiter ;

三、测试

调用方式:call AddColumnIfNotExists(表名, 字段名,属性, 插入到那个字段之后);

1.新建一个员工表

#员工表
CREATE TABLE emp(
empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 comment '编号',
ename VARCHAR(20) NOT NULL DEFAULT "" comment '名字',
job VARCHAR(9) NOT NULL DEFAULT "" comment '工作',
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 comment '上级编号'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
mysql> desc emp;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| empno | mediumint(8) unsigned | NO | | 0 | |
| ename | varchar(20) | NO | | | |
| job | varchar(9) | NO | | | |
| mgr | mediumint(8) unsigned | NO | | 0 | |
+-------+-----------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

2.新插入字段

(1)无null、无default

mysql> call AddColumnIfNotExists('emp', 'hiredatea', 'DATE comment "入职时间"','');
+-------------------------------------------------------------------------+
| @stmt |
+-------------------------------------------------------------------------+
| ALTER TABLE `emp` ADD COLUMN `hiredatea` DATE comment "入职时间" NULL;
|
+-------------------------------------------------------------------------+
1 row in set (0.09 sec) Query OK, 0 rows affected (0.13 sec) mysql> desc emp;
+-----------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------+------+-----+---------+-------+
| empno | mediumint(8) unsigned | NO | | 0 | |
| ename | varchar(20) | NO | | | |
| job | varchar(9) | NO | | | |
| mgr | mediumint(8) unsigned | NO | | 0 | |
| hiredatea | date | YES | | NULL | |
+-----------+-----------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

(2).有not null、无default

mysql> call AddColumnIfNotExists('emp', 'sal', 'DECIMAL(7,2) not null comment "
薪水"', '');
+---------------------------------------------------------------------------+
| @stmt |
+---------------------------------------------------------------------------+
| ALTER TABLE `emp` ADD COLUMN `sal` DECIMAL(7,2) not null comment "薪水"; |
+---------------------------------------------------------------------------+
1 row in set (0.06 sec) Query OK, 0 rows affected (0.09 sec) mysql> desc emp;
+-----------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------+------+-----+---------+-------+
| empno | mediumint(8) unsigned | NO | | 0 | |
| ename | varchar(20) | NO | | | |
| job | varchar(9) | NO | | | |
| mgr | mediumint(8) unsigned | NO | | 0 | |
| hiredatea | date | YES | | NULL | |
| sal | decimal(7,2) | NO | | NULL | |
+-----------+-----------------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

(3).无null、有default

mysql> call AddColumnIfNotExists('emp', 'comm', 'DECIMAL(7,2) default 0 comment
"红利"', '');
+--------------------------------------------------------------------------------------+
| @stmt|
+--------------------------------------------------------------------------------------+
| ALTER TABLE `emp` ADD COLUMN `comm` DECIMAL(7,2) default 0 comment "红利" NOT NULL; |
+--------------------------------------------------------------------------------------+
1 row in set (0.06 sec) Query OK, 0 rows affected (0.09 sec) mysql> desc emp;
+-----------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------+------+-----+---------+-------+
| empno | mediumint(8) unsigned | NO | | 0 | |
| ename | varchar(20) | NO | | | |
| job | varchar(9) | NO | | | |
| mgr | mediumint(8) unsigned | NO | | 0 | |
| hiredatea | date | YES | | NULL | |
| sal | decimal(7,2) | NO | | NULL | |
| comm | decimal(7,2) | NO | | 0.00 | |
+-----------+-----------------------+------+-----+---------+-------+
7 rows in set (0.01 sec)

(4).有not null、有default、插入都某个字段之后

mysql> call AddColumnIfNotExists('emp', 'deptno', 'varchar(20) not null default
"" comment "部门编号"', 'job');
+------------------------------------------------------------------------------------------------------+
| @stmt |
+------------------------------------------------------------------------------------------------------+
| ALTER TABLE `emp` ADD COLUMN `deptno` varchar(20) not null default "" comment "部门编号" after job; |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec) Query OK, 0 rows affected (0.13 sec) mysql> desc emp;
+-----------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------+------+-----+---------+-------+
| empno | mediumint(8) unsigned | NO | | 0 | |
| ename | varchar(20) | NO | | | |
| job | varchar(9) | NO | | | |
| deptno | varchar(20) | NO | | | |
| mgr | mediumint(8) unsigned | NO | | 0 | |
| hiredatea | date | YES | | NULL | |
| sal | decimal(7,2) | NO | | NULL | |
| comm | decimal(7,2) | NO | | 0.00 | |
+-----------+-----------------------+------+-----+---------+-------+
8 rows in set (0.01 sec)

MySQL添加可重复执行列的更多相关文章

  1. MySQL添加字段和删除字段

    MySQL添加字段应该如何实现呢?这是很多刚刚接触MySQL数据库的新人都提到过的问题,下面就为您介绍MySQL添加字段和删除字段的方法,希望对您能有所启迪. MySQL添加字段: alter tab ...

  2. ubuntu下mysql添加用户的问题

    在ubuntu下使用命令: $:sudo apt-get install mysql-server 命令安装的Mysql 版本为:Server version: 5.7.13-0ubuntu0.16. ...

  3. mysql添加用户和用户权限

    Mysql添加用户使用可以对mysql数据库用户表有操作权限的用户名登陆mysqlinsert into user(Host,User,Password) values('%','name','pas ...

  4. MySQL选用可重复读之前一定要想到的事情

    原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必 ...

  5. mysql添加外键无法成功的原因

    最近很忙,碰到很多问题都忘了发上来做个记录,现在又忘了,FUCK,现在碰到一个问题, 就是mysql添加外键总是无法成功,我什么都试了,就是没注意signed和unsigned,FUCK,因为我用my ...

  6. MySQL添加用户错误:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value解决方法

    MySQL添加新用户时出现如下报错,如下图: 经过查资料了解到: mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的. 改为以 ...

  7. Windows系统下MySQL添加到系统服务方法(mysql解压版)

    MySQL软件版本:64位 5.7.12 1.首先配置MySQL的环境变量,在系统环境变量Path的开头添加MySQL的bin目录的路径,以“;”结束,我的路径配置如下: 2.修改MySQL根目录下的 ...

  8. 转载:mysql添加用户、删除用户、授权、修改密码

    mysql添加用户.删除用户.授权.修改密码等 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码1.新建用户. //登录MYSQL @>mysql -u root -p @> ...

  9. MySQL中MyISAM与InnoDB区别及选择,mysql添加外键

    InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...

随机推荐

  1. Jsop的原理

    Jsop的原理:利用script不存在跨域的问题,动态创建script标签,把需要请求的数据源地址赋值给其src属性,并且指定一个回调函数,从而接受到我们想要的数据

  2. C++类型检查

    与大多数语言一样,C++也是类型决定了能对该对象进行的操作,一条表达式是否合法依赖于其中参与运算的对象的类型,C++是一种静态数据类型语言,它的类型检查发生在编译时, 因此编译器知道程序中每一个变量对 ...

  3. 通过BeanPostProcessor理解Spring中Bean的生命周期

    通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...

  4. MySQL中的文件

    查看数据目录: select @@datadir; 共享表空间: ibdata1 Redo log file:ib_logfile0, ib_logfile1 二进制日志:需要配置参数 server- ...

  5. 百度AI认为最漂亮的中国女星是----范冰冰

    一.程序说明 1.1 程序说明 之前写调用百度AI接口的程序,然后刷到了两条明星的新闻,就想到了写个给明星颜值排下名的程序. 程序的关键点是两个,第一个是百度AI接口的调用这点其实直接使用早前实现的类 ...

  6. Wireshark:No interfaces found解决方法(Windows 10)

    启动Wireshark时有时会报“No interfaces found”,找不到网卡进行截包.造成这种情况的原因可能有两个,一是npf服务没启动,二是当前用启对网卡没有拦截权限. 一.npf服务未启 ...

  7. Win10系列:JavaScript写入和读取文件

    正如上面的内容中所提到的,文件保存选取器用于保存文件,通过Windows.Storage.Pickers命名空间中的FileSavePicker类的pickSaveFileAsync函数可以向指定的文 ...

  8. svg 学习笔记

    http://git.oschina.net/heboliufengjie/demo/tree/master/svg?dir=1&filepath=svg&oid=3a44203972 ...

  9. day1 计算机硬件基础

    CPU包括运算符和逻辑符 储存器包括内存和硬盘 7200转的机械硬盘一般找到想要的数据需要9毫秒的时间      4+5   5毫秒的时间是磁头到磁盘轨道    4毫秒是平均开始查找想要的数据到找到的 ...

  10. unity中把一个图片切割成两个UI图片

    1.在unity3D的Project视图下选中需要更改的图片,将图片的Texture Type更改为Sprite (2D and UI),点击Apply即可.操作如图所示: 2.完成步骤一,点击App ...