MySQL添加可重复执行列
一、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添加可重复执行列的更多相关文章
- MySQL添加字段和删除字段
MySQL添加字段应该如何实现呢?这是很多刚刚接触MySQL数据库的新人都提到过的问题,下面就为您介绍MySQL添加字段和删除字段的方法,希望对您能有所启迪. MySQL添加字段: alter tab ...
- ubuntu下mysql添加用户的问题
在ubuntu下使用命令: $:sudo apt-get install mysql-server 命令安装的Mysql 版本为:Server version: 5.7.13-0ubuntu0.16. ...
- mysql添加用户和用户权限
Mysql添加用户使用可以对mysql数据库用户表有操作权限的用户名登陆mysqlinsert into user(Host,User,Password) values('%','name','pas ...
- MySQL选用可重复读之前一定要想到的事情
原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必 ...
- mysql添加外键无法成功的原因
最近很忙,碰到很多问题都忘了发上来做个记录,现在又忘了,FUCK,现在碰到一个问题, 就是mysql添加外键总是无法成功,我什么都试了,就是没注意signed和unsigned,FUCK,因为我用my ...
- MySQL添加用户错误:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value解决方法
MySQL添加新用户时出现如下报错,如下图: 经过查资料了解到: mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的. 改为以 ...
- Windows系统下MySQL添加到系统服务方法(mysql解压版)
MySQL软件版本:64位 5.7.12 1.首先配置MySQL的环境变量,在系统环境变量Path的开头添加MySQL的bin目录的路径,以“;”结束,我的路径配置如下: 2.修改MySQL根目录下的 ...
- 转载:mysql添加用户、删除用户、授权、修改密码
mysql添加用户.删除用户.授权.修改密码等 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码1.新建用户. //登录MYSQL @>mysql -u root -p @> ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
随机推荐
- Mysql for Linux安装配置之—— 源码安装
1.安装 --假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源码压缩文件1)先安装cmake(mysql5.5以后是通过cmake来编译的) # ta ...
- spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)
转载:spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序) 众所周知,spring声明式事务是基于AOP实现的,那么,如果我们在同一个方法自定义多个AOP,我们如何指定他们的执 ...
- Hotspot的minor GC
内容来自<java性能优化>. 上图展示了Hotspot minor GC的过程:eden中的存活对象和from中"不够老"的对象,被移动到to中,from中" ...
- find中的-exec参数
1.find中的-exec参数 在当前目录下(包含子目录),查找所有txt文件并找出含有字符串"bin"的行 find ./ -name "*.txt" -ex ...
- [转]java异常中Exception捕获不到的异常
一 概念 众所周知java提供了丰富的异常类,这些异常类之间有严格的集成关系,分类为 父类Throwable Throwable的两个子类Error和Exception Exception的两个子类C ...
- 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis
安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...
- 操作系统IIS安装
IIS在不同的操作系统的安装稍有些差异,如: 1.Windows XP 快捷安装IIS的话,推荐使用IIS一键安装程序包.或者找响应文件包i386,安装所需文件 2.Windows 7 安装IIS,则 ...
- cpu-z for ubuntu 12.04 64bit : cpu-g
wget https://launchpad.net/~phantomas/+archive/ppa/+files/cpu-g_0.9.0_amd64.deb sudo dpkg -i cpu-g*. ...
- python django 访问static静态文件
settings 文件配置: STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'),)PROJEC ...
- 为什么IT运维工程师要学习Linux系统
不论你是否知道,其实你每天都在使用Linux.每次你访问微博.百度甚至是一些小电影网站,你的客户端(浏览器)都在与运行在Linux系统上的服务端程序进行通讯,大多数的电子设备,例如数位录像机.飞机.自 ...