TiDB的分表的大数据更新会报错 返回
SqlSugar
沟通中
5
562
碧雪晴天 发布于2025/9/1
悬赏:0 飞吻
执行代码如下
public class TestTiDBSplitTable
{
public async Task TestInsert()
{
var db = new SqlSugarScope(new ConnectionConfig
{
ConfigId = "TIDB",
ConnectionString =
"Data Source=;Port=;Database=;Uid=;Pwd=;AllowLoadLocalInfile=;CharSet=;",
DbType = DbType.Tidb,
IsAutoCloseConnection = true,
}, db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 执行SQL: {sql}");
if (pars != null && pars.Length > 0)
{
Console.WriteLine($"参数: {string.Join(", ", pars.Select(p => $"{p.ParameterName}={p.Value}"))}");
}
};
});
var insertList = new List<SplitTestTable>();
var updateList = new List<SplitTestTable>();
for (int i = 0; i < 10; i++)
{
insertList.add(new SplitTestTable()
{
Id = SnowFlakeSingle.instance.NextId(),
CreateTime = Convert.ToDateTime($"2019-12-{i + 1}"), //要配置分表字段通过分表字段建表
Name = "jack" + i
});
}
for (int i = 0; i < 10; i++)
{
updateList.add(new SplitTestTable()
{
Id = SnowFlakeSingle.instance.NextId(),
CreateTime = Convert.ToDateTime($"2019-12-{i + 1}"), //要配置分表字段通过分表字段建表
Name = "jack" + i
});
}
try
{
await db.Fastest<SplitTestTable>().EnableDataAop().SplitTable()
.BulkCopyAsync(insertList);
await db.Fastest<SplitTestTable>().EnableDataAop().SplitTable()
.BulkUpdateAsync(updateList); //会报错,TiDB和MySQL语法不一样
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
[SplitTable(SplitType.Year)] //按年分表 (自带分表支持 年、季、月、周、日)
[SugarTable("SplitTestTable_{year}{month}{day}")] //3个变量必须要有,这么设计为了兼容开始按年,后面改成按月、按日
public class SplitTestTable
{
[SugarColumn(IsPrimaryKey = true)] public long Id { get; set; }
public string Name { get; set; }
[SugarColumn(IsNullable = true)] public DateTime UpdateTime { get; set; }
[SplitField] public DateTime CreateTime { get; set; }
}
插入是正确的,
BulkUpdateAsyncupdateList
这里会报错,原因是TiDB和MySQL语法不一样,BulkUpdateAsync的时候会调用到MySqlFastBuilder执行
public override async Task CreateTempAsync<T>(DataTable dt)
int num = await this.Context.Ado.ExecuteCommandAsync($"Create TEMPORARY table {dt.TableName}({sql}) ");我贴的代码会生成一个创建临时表的语句
Create TEMPORARY table temp1962344567575547904 ( SELECT `Id`,`Name`,`UpdateTime`,`CreateTime` FROM `SplitTestTable_20190101` WHERE ( 1 = 2 ) )
在MySQL这样是可以的,TiDB不支持这个写法,它只能用明确写明列的写法创建临时表:
CREATE TEMPORARY TABLE users ( id BIGINT, name VARCHAR(100), city VARCHAR(50), PRIMARY KEY(id) );
热忱回答(5)
-
碧雪晴天 VIP0
2025/9/1粘贴重复了
0 回复 -
fate sta VIP0
2025/9/1CREATETEMPORARYTABLEusers (idBIGINT,nameVARCHAR(100),cityVARCHAR(50),PRIMARYKEY(id));这个语法改动就大了。你可以pull给我。。
0 回复 -
fate sta VIP0
2025/9/1if(db?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel = DbType.Tidb)
{
加个逻辑
}
0 回复 -
碧雪晴天 VIP0
2025/9/1提了
0 回复 -
fate sta VIP0
2025/9/1SqlSugarCore 5.1.4.201-preview10
过五分钟后安装
0 回复