每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误。

为了解决这个问题,研究了一下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数据库一个小程序实现自动创建分表。的更多相关文章

  1. 基于Mysql数据库亿级数据下的分库分表方案

    移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据的用户行为分析等这样的分析,都需要依靠数据都统计和分析,当数据量小时,问题没有暴露出来,数据库方面的优化显得不太重要,一旦数据量越来越大时, ...

  2. 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。

    <?php $dbname = 'test';//数据库 $tab1 = 'user'; //执行的表 $tab2 = 'user_bak'; //被触发的表 $conn = mysql_con ...

  3. 应用程序初次运行数据库配置小程序(Java版)

    应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的 ...

  4. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  5. [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  6. Python 练习冊,每天一个小程序

    Python 练习冊,每天一个小程序 说明:     Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「 ...

  7. 微信小程序-微信自动退款(Java后台)

    微信小程序-微信自动退款 1.首先分享 微信自动退款接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 微信付款 代码案例 ...

  8. SpringBoot+Mybatis 自动创建数据表(适用mysql)

    Mybatis用了快两年了,在我手上的发展史大概是这样的 第一个阶段 利用Mybatis-Generator自动生成实体类.DAO接口和Mapping映射文件.那时候觉得这个特别好用,大概的过程是这样 ...

  9. c++学习笔记---04---从另一个小程序接着说

    从另一个小程序接着说 文件I/O 前边我们已经给大家简单介绍和演示过C和C++在终端I/O处理上的异同点. 现在我们接着来研究文件I/O. 编程任务:编写一个文件复制程序,功能实现将一个文件复制到另一 ...

随机推荐

  1. 解决Silverlight5_tools无法安装问题(试验已成功)

    当前位置: 银光首页 > Silverlight > Silverlight学习教程 > 命令:regedit 打开节点:HKEY_LOCAL_MACHINE\SOFTWARE\Mi ...

  2. const关键字与指针

    const与指针在一起的几种情况. const int *p1; //表示p1本身不是const,指向的变量是const. const *int p2; //语法错误 int const *p3; / ...

  3. WinPcap编程(一)

    0. 按着文档顺序写的. 开发环境:win10+VS2013. 配置WinPcap环境就不多说.直接给网址:http://blog.sina.com.cn/s/blog_57432f380101qh3 ...

  4. IOS QuartzCore核心动画框架

    IOS QuartzCore核心动画框架 核心动画框架 使用核心动画需要引入的框架:#import CALayer: CoreAnimation CALayer就是UIView上的图层,很多的CALa ...

  5. [151116 记录] 使用Python3.5爬取豆瓣电影Top250

    这一段时间,一直在折腾Python爬虫.已有的文件记录显示,折腾爬虫大概个把月了吧.但是断断续续,一会儿鼓捣python.一会学习sql儿.一会调试OpenCV,结果什么都没学好.前几天,终于耐下心来 ...

  6. 未能加载文件或程序集XXX或它的某一个依赖项。试图加载格式不正确的程序。

    今天发布网站时,老是弹出下面这样一个错误. 经过一番折腾终于找到答案: 方法一: 在IIS中设置, 属性 ——常规—— 启用32位应用程序 修改为True. 方法二: 修改项目属性——生成——目标平台 ...

  7. hadoop hdfs 命令行 设置文件夹大小的上限 quota:配额

    >bin/hdfs dfs -put readme.txt /finance >bin/hdfs dfs -du -s /finance > /finance >bin/hdf ...

  8. Network Saboteur

    poj2531:http://poj.org/problem?id=2531 题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大.题解:一开始比知道怎么办,想用 ...

  9. C 和 OC 字符串转换 NSString 和 char * 转换 const char* 与 char *

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { char *s = "He ...

  10. The Suspects(简单的并查集)

    Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, wa ...