一、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. SQL - 常用的特殊查询

    sql 查询某字段不重复的全部记录: select * from table where fid in(Select min(fid) FROM table group by name) :

  2. django学习之——创建项目

    创建项目让我迷茫了会: 直接cmd 执行django-admin.py startproject  pro_name 肯定是不行的 必须cd到 D:\Program Files\Python3.3.5 ...

  3. WebGoat 8安装、配置、使用教程(CentOS)

    一.说明 1.1 背景说明 之前只用过dvwa,听说WebGoat也是类似的平台后,想装来试试有没有什么异同. 看了下载文件,和网上官方的.非官方的安装教程,感觉很多都对不上: 最后发现WebGoat ...

  4. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程

    一.服务端请求伪造漏洞 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助 ...

  5. npm run build 打包后,如何运行在本地查看效果(Apache服务)

    目前,使用vue-cli脚手架写了一个前端项目,之前一直是使用npm run dev 在8080端口上进行本地调试.项目已经进行一半了,今天有时间突然想使用npm run build进行上线打包,试试 ...

  6. python3练习-装饰器

    在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...

  7. IntelliJ Idea 快捷键列表

    最重要:1Ctrl+Alt+Shift+T:查找类2重构3提取父类 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift ...

  8. POJ 2456 Agressive cows(二分)

    POJ 2456 Agressive cows 农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这 些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,0 ...

  9. 使用 NumPy 和 Matplotlib 绘制函数图

    Numpy是用python进行科学计算的基本程序包. 它主要包含以下功能: ♦强大的n维数组对象 ♦复杂(广播)函数工具 ♦用于集成c/c++和Fortran代码-有用的线性代数 ♦傅里叶变换和随机数 ...

  10. 红黑树与AVL

     红黑树和avl树都属于自平衡二叉树: 两者查找.插入.删除的时间复杂度相同: 包含n个内部结点的红黑树的高度是o(logn); TreeMap是一个红黑树的实现,能保证插入的值保证排序       ...