• 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

    }

     

            

    第一次发博客,先发上去看看。    

    相互了解是朋友,相互理解是知己。
  • 相关阅读:
    secureCRT常用设置
    SecureCRT恢复默认字体
    hdu 1515 dfs
    hdu 2216 bfs
    hdu 1973 bfs+素数判断
    hdu 1429 bfs+状压
    poj 3463 次短路
    hdu 2962 最短路+二分
    hdu 2112 最短路
    hdu 3397 线段树
  • 原文地址:https://www.cnblogs.com/cuittzq/p/4855009.html
Copyright © 2020-2023  润新知