TiDB的分表的大数据更新会报错 返回

SqlSugar 沟通中
5 562

执行代码如下


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

  • 粘贴重复了     

    0 回复
  • CREATE TEMPORARY TABLE users (
        id BIGINT,
        name VARCHAR(100),
        city VARCHAR(50),
        PRIMARY KEY(id)
    );

    这个语法改动就大了。你可以pull给我。。

    0 回复
  • if(db?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel = DbType.Tidb)

    {

     加个逻辑

    }

    0 回复
  • 提了

    0 回复
  • SqlSugarCore 5.1.4.201-preview10

    过五分钟后安装

    0 回复