sqlsugar 对接mysql分表。sqlsguar分表注意事项。分表思路,通过日期获取分表表名等 电脑版发表于:2021/7/18 17:29 官方文档: https://www.donet5.com/Home/Doc?typeId=1201 ## sqlsguar分表注意事项 ### 注意一:需要有一个分表字段,插入的时候需要对这个字段赋值 官方例子上面的: ``` [SplitField] //分表字段 在插入的时候会根据这个字段插入哪个表,在更新删除的时候用这个字段找出相关表 public DateTime CreateTime { get; set; } ``` 插入的时候需要对这个字段赋值,不然他不知道向那个表插入。虽然不赋值他会有一个默认的日期:1900-01-01 00:00:00 ### 注意二:主键类型 如果使用雪花id,主键类型要使用long ![](https://img.tnblog.net/arcimg/aojiancc2/66cbedcc86534945b86ba1afbaf36353.png) mysql对应的主键类型是:bigint(64) ``` id bigint(64) PRIMARY key, ``` 但是要注意如果最开始主键类型写错了,写成了int,然后去执行插入失败了,会提示:MySql.Data.MySqlClient.MySqlException:“Out of range value for column 'id' at row 1” 就是超长了,这个时候不能去修改数据库的表,修改成多长都是报这个错。因为第一次插入的时候他已经生成了一个表了,而且主键是int类型的,长度明显不够。 ![](https://img.tnblog.net/arcimg/aojiancc2/48d054bf610044348b2953beff497158.png) 这个时候应该把生成的这个表删除掉,然后重新执行就行了,因为使用了分表插入的时候,插入的表其实不是我们在数据库里边创建的表,而是他内部的逻辑在控制,要注意这点。 ## 通过日期获取分表名 虽然sqlsugar有根据时间直接获取分表表名的方法 ``` GetTableName(data.CreateTime);//根据时间获取表名 ``` 还有根据一个区间获取的 ``` SplitTable(beginDate,endDate) ``` 但是有时候我们的sql比较复杂的,需要自己手写sql的,所以我们需要自己封装一个方法,通过日期获取分表表明的方法,其实也非常简单。根据时间就可以去找到分表了。比如要查询2022-5的数据要查询的肯定就是20220101这张表(根据年分表的情况),月都不用管,只取年,然后格式化一下转字符串就可以得到分表了,只查询一个表很方便,又不是一个区间。 ``` /// <summary> /// 根据时间获取分表的名称 /// 根据时间就可以去找到分表了。比如要查询2022-5的数据要查询的肯定就是20220101这张表,月都不用管,只取年,然后格式化一下转字符串就可以得到分表了,只查询一个表很方便,又不是一个区间 /// </summary> /// <param name="_dateTime"></param> /// <returns></returns> public static string GetSplitTableNameByDate(DateTime _dateTime) { //根据传过来的时间取到年,只取年即可,因为分表是根据年分表的 DateTime dateTime = new DateTime(_dateTime.Year, 1, 1); string splitTableName = dateTime.ToString("yyyyMMdd"); return splitTableName; } ``` 测试代码如下: ``` DateTime dateTime = DateTime.Parse("2022-6-6"); string tableName = "statisticsdata_month_" + DateTimeTools.GetSplitTableNameByDate(dateTime); Console.WriteLine(tableName); string tableName2 = "statisticsdata_month_" + DateTimeTools.GetSplitTableNameByDate(DateTime.Parse("2021-09-24")); Console.WriteLine(tableName2); ``` 效果如下,可以正确的得到分表的表名: ![](https://img.tnblog.net/arcimg/aojiancc2/704cf018f3c14887badeb3411d7b8a0f.png) 贴一下分表名称使用的规则 ``` [SugarTable("statisticsdata_month_{year}{month}{day}")] ```