Mysql数据库一个小程序实现自动创建分表。
每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误。
为了解决这个问题,研究了一下mysql的 information_schema 表:
information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。
OK!事情已经变得相当简单了。高手可以无视以下内容了。
按月分表为例:
第一步:查询出当月以及下月满足分表规则的表名
select table_name,table_schema from information_schema.tables where table_schema =@DatabaseName and table_type='base table' and table_name like @table_name;
当然你可以拆分为两步来实现。
第二步:对比当月与下月表名数据和创建表。
当月有的下月没有,这时候就应该创建一个下月的表。
如何创建?最简单也是最保险的就是copy当月的表。
为啥不用建表语句?平时升库的时候,你去修改过建表语句?修改过建表事件?如果你修改过那最好!
Copy当月表我们只需要表结构不需要表数据所以一条sql语句就搞定了:
CREATE TABLE 下月表 LIKE 当月表;
这样一来,两条语句就搞定。
好我们来聊聊代码:
三层架构 business Dal UI 。UI 和 DAL 没啥说的。
直接上核心代码:
///
<summary>
/// 扫描并创建表
///
</summary>
private
void AnalyseAndCreatTables()
{
int scantime = 5;
while (true)
{
try
{
ShowBusiness.ShowMsg("获取数据库信息");
// 获取数据库信息
BGetDataBseName getdatabaseinfo = new
BGetDataBseName();
getdatabaseinfo.Execute();
List<string> databases = getdatabaseinfo.DataBases;
if (databases != null)
{
foreach (var itemDatabase in databases)
{
this.HandSpiltByMonth(itemDatabase);
}
}
}
catch (Exception ex)
{
}
finally
{
Thread.Sleep(scantime * 1000 * 60);
}
}
}
///
<summary>
/// 处理按月分表
///
</summary>
///
<param name="databaseName">数据库名</param>
private
void HandSpiltByMonth(string databaseName)
{
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库 按月分表", databaseName));
#region 按月分表
string nowtablePostfix = string.Format("{0}{1}", DateTime.Now.Year.ToString().Substring(2, 2), DateTime.Now.Month.ToString().PadLeft(2, '0'));
string nexttablePostfix = string.Format("{0}{1}", DateTime.Now.AddMonths(1).Year.ToString().Substring(2, 2), DateTime.Now.AddMonths(1).Month.ToString().PadLeft(2, '0'));
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库中按月分表的当前月的表", databaseName));
// 获取该数据库中按月分表的当前月的表
DGetTablesFromDatabase getNowDatatables = new
DGetTablesFromDatabase(databaseName, nowtablePostfix);
getNowDatatables.Execute();
List<string> nowtablse = getNowDatatables.TablesList;
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库当月的表:{1}", databaseName, string.Join(",", nowtablse.ToArray())));
// 获取该数据库中按月分表的下月的表
DGetTablesFromDatabase getNextDatatables = new
DGetTablesFromDatabase(databaseName, nexttablePostfix);
getNextDatatables.Execute();
List<string> nextDatatables = getNextDatatables.TablesList;
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库下月的表:{1}", databaseName, string.Join(",", nextDatatables.ToArray())));
// 对比当前月表和下月表,如果下月表中没有,则新建
if (nowtablse != null)
{
foreach (var nowitem in nowtablse)
{
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库对比当前月表和下月表", databaseName));
///基础数据库名
string nowbeforstr = nowitem.Substring(0, nowitem.IndexOf(nowtablePostfix));
// 是否已经创建
bool isCreated = false;
if (nextDatatables != null && nextDatatables.Count > 0)
{
foreach (var nextitem in nextDatatables)
{
// 基础数据库名
string nextbeforstr = nowitem.Substring(0, nextitem.IndexOf(nexttablePostfix));
if (nowbeforstr == nextbeforstr)
{
isCreated = true;
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库 表{1}已经创建", databaseName, nextitem));
}
}
}
if (!isCreated)
{
string creatTableName = nowitem.Replace(nowtablePostfix, nexttablePostfix);
ShowBusiness.ShowMsg(string.Format("处理【{0}】数据库 创建表{1}", databaseName, creatTableName));
DCreatTableFromDatabase creatTableFromDatabase = new
DCreatTableFromDatabase(databaseName, nowitem, creatTableName);
creatTableFromDatabase.Execute();
int results = creatTableFromDatabase.Result;
}
}
}
#endregion
}
第一次发博客,先发上去看看。
Mysql数据库一个小程序实现自动创建分表。的更多相关文章
- 基于Mysql数据库亿级数据下的分库分表方案
移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据的用户行为分析等这样的分析,都需要依靠数据都统计和分析,当数据量小时,问题没有暴露出来,数据库方面的优化显得不太重要,一旦数据量越来越大时, ...
- 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。
<?php $dbname = 'test';//数据库 $tab1 = 'user'; //执行的表 $tab2 = 'user_bak'; //被触发的表 $conn = mysql_con ...
- 应用程序初次运行数据库配置小程序(Java版)
应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的 ...
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- Python 练习冊,每天一个小程序
Python 练习冊,每天一个小程序 说明: Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「 ...
- 微信小程序-微信自动退款(Java后台)
微信小程序-微信自动退款 1.首先分享 微信自动退款接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 微信付款 代码案例 ...
- SpringBoot+Mybatis 自动创建数据表(适用mysql)
Mybatis用了快两年了,在我手上的发展史大概是这样的 第一个阶段 利用Mybatis-Generator自动生成实体类.DAO接口和Mapping映射文件.那时候觉得这个特别好用,大概的过程是这样 ...
- c++学习笔记---04---从另一个小程序接着说
从另一个小程序接着说 文件I/O 前边我们已经给大家简单介绍和演示过C和C++在终端I/O处理上的异同点. 现在我们接着来研究文件I/O. 编程任务:编写一个文件复制程序,功能实现将一个文件复制到另一 ...
随机推荐
- 那些年被我坑过的Python——一夫当关 第十三章(堡垒机初步设计)
堡垒机架构 堡垒机的主要作用权限控制和用户行为审计,堡垒机就像一个城堡的大门,城堡里的所有建筑就是你不同的业务系统 , 每个想进入城堡的人都必须经过城堡大门并经过大门守卫的授权,每个进入城堡的人必 ...
- Python 异常处理--raise函数用法
raise语句手工引发一个异常: "raise" [expression ["," expression ["," expression]] ...
- 《学习Opencv》第五章 习题6
这是第五章 习题5.6的结合版,其中实现了摄像头抓拍功能,能够成功运行. #include "stdafx.h" #include "cv.h" #includ ...
- 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b
1.单利模式概述 链接: iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...
- 计算广义积分$$\int_0^{+\infty}\cos x^p {\rm d}x,\int_0^{+\infty}\sin x^p {\rm d}x, p>1$$
${\bf 解:}$ 在角状域$G=\{z\in\mathbb{C}|0<{\rm Arg}z<\frac{\pi}{2p}\}$上引入辅助函数$e^{iz^p}$, 其中$z^p=|z| ...
- hdfs 常用命令
(2)bin/hdfs dfs -mkdir -p /home/雨渐渐 (3)scp /media/root/DCE28B65E28B432E/download/第2周/ChinaHadoop第二讲\ ...
- couchdb and redis
http://www.jdon.com/artichect/scalable5.html http://www.dedecms.com/knowledge/data-base/nosql/2012/0 ...
- java.lang.String.indexOf()用法
java.lang.String.indexOf(char ch) 方法返回字符ch在指定字符串中第一次出现的下标索引位置 如果字符ch在指定的字符串中找不到,则返回-1 示例: import jav ...
- STM32F10x 学习笔记5(USART实现串口通讯 1)
STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器.通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间 ...
- java学习之二维数组
java当中的二维数组,存储一组比较特殊的对象.他存储一个数组,同时存储的数组当中又存储着元素. java二维数组的声明方式一: class Arr2Demo { public static void ...