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 把数据和索引存放在表空间 ...
随机推荐
- 元类应用ORM实现
首先看下一个简单的例子 # 需求 import numbers class Field: pass class IntField(Field): # 数据描述符 def __init__(self, ...
- 通过DBMS_REDEFINITION包对表在线重定义
基础介绍 Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入.删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delet ...
- 正则表达式test()和exec()、 search() 和 replace()用法实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux jdk install and tomcat install
1● linux安装jdk1.8 Download jdk1.8 export JAVA_HOME=/usr/java/jdk1.8.0_181 export JRE_HOME=${JAVA_ ...
- Linux 控制CPU使用率
曾经看过<编程之美>上提到说使 CPU的使用率固定在百分之多少.然后这次刚好要用到这个东西,下面是一个简单的实现.基于多线程: Linux 版本: #include <iostrea ...
- swap分区不足ubuntu休眠
安装uswsusp Ubuntu gnu/linux只需 代码: sudo aptitude install uswsusp Arch gnu/linux系统 代码: sudo pacman -S u ...
- nyoj 1091 还是01背包(超大数dp)
nyoj 1091 还是01背包 描述 有n个重量和价值分别为 wi 和 vi 的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值 1 <= n <=40 1 ...
- OO第三次课程总结分析
OO第三次课程总结分析 规格化设计发展历史 在网上找了好久也没找到合适的信息,稍稍参考了同学的博客.大致如下:最初的的软件并没有形式化方法,随着软件工程的兴起,为了便于工程间的协调管理,人们提出采用工 ...
- 简单选择排序(Simple Selection Sort)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- uitableviewcell textlabel detailtextLabel 换行的位置及尺寸问题
我们在使用uitableView的时候,一些简单的cell样式其实是不需要自定义的,但是系统的方法又似乎又无法满足需要,这时候我们就需要在系统上做一些改变来达到我们的需求: 像这种cell,简单分析下 ...