Mysql数据库一个小程序实现自动创建分表。
2018-06-18 02:29:19来源:未知 阅读 ()
每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误。
为了解决这个问题,研究了一下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
}
?
????????
第一次发博客,先发上去看看。????
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:ADO.NET数据库
下一篇:页面导航
- 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent 2020-06-05
- 分享一个自己项目中用到的c++版的日志类(对初学者十分有用的 2020-05-22
- C++ 单独编译 2020-05-10
- 图 2020-05-02
- STL之map 2020-04-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash