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

为了解决这个问题,研究了一下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. CSS 的 border 样式

    制作过网页的人都有为画线而烦恼的经历,先来认识一下“Border”(画边框),它是CSS的一个属性,用它可以给能确定范围的HTML标记(如TD.DIV等等)画边框,它可以定义边框线的类型.宽度和颜色, ...

  2. 【译】UI设计基础(UI Design Basics)--导航(Navigation)(六)

    [译]UI设计基础(UI Design Basics)--导航(Navigation)(六)

  3. HTML/W3C-WHATWG-Differences

    Differences between the W3C HTML 5.1 specification and the WHATWG LS The W3C HTML 5.1 specification: ...

  4. 零零碎碎搞了一天最后发现是ruby版本问题

    查来查去查不到问题,后来在stackoverflow看到: http://stackoverflow.com/questions/22352838/ruby-gem-install-json-fail ...

  5. 工作那些事(二)应聘时填写个人信息ABCD

    先看看都有那些: 公司A: 填写来访人员登记表(在前台的那种),内容包括: 姓名.时间.电话.职位. 公司B: 填写来访人员登记表(在前台的那种),内容包括: 姓名.时间.电话.身份证号码().事由( ...

  6. 几个Uboot命令

    1 nand scrub 这个命令会擦除坏块信息,将坏块标识成好的,但此时这个坏块有潜在有危险,在特定条件下仍会造成数据的丢失,所以应该谨慎使用. Run U-boot and then use th ...

  7. bzoj1978

    朴素的算法是O(n2logn)观察这个算法,似乎很难在进行优化我们就要换一种思路考虑到一个数的约数总不是很多,穷举约数也是可以在O(sqrt(x))的时间内完成的并且注意到,能否继续往下选数,只在于最 ...

  8. COJ 2124 Day8-例1

    Day8-例1 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定n.m的值,求

  9. 「Poetize3」Heaven Cow与God Bull

    描述 Description 给定一个整数n,求一个整数m,满足m<=n,并且m/phi(m)的值最大.注:phi(m)代表m的欧拉函数,即不大于m且与m互质的数的个数. 题解:m/phi(m) ...

  10. C#代码实现隐藏任务栏、开始菜单和禁用任务管理

    一:截图,主要是调用系统接口和更改注册表实现功能 二:代码 using System; using System.Collections.Generic; using System.Linq; usi ...