在Dapper与.NET 6中实现toId字段自增的批量插入咨询
实现建议
方案1:单批次内生成连续ID
如果只要求单次插入的批次里toId是连续序列(比如本次插入的10条记录toId从1到10),可以直接用数据库的窗口函数生成:
var sql = @"INSERT INTO table1 (toId, teId, dateShift, SectorOrigen) SELECT ROW_NUMBER() OVER (ORDER BY teID) AS toId, teID, @dateModify, @LastSector FROM table2";
注:ORDER BY teID可根据实际需求替换成其他排序字段,保证序列的稳定性。
方案2:全局连续自增(跨批次衔接)
如果要求所有插入的记录toId全局连续(比如上次插入最后一条toId是10,本次插入第一条toId从11开始),需要先获取table1当前最大的toId,再结合窗口函数生成序列:
步骤1:获取当前最大toId
var maxToId = connection.QueryFirstOrDefault<int?>("SELECT ISNULL(MAX(toId), 0) FROM table1"); var startId = maxToId.GetValueOrDefault() + 1;
步骤2:生成连续序列插入
var sql = @"INSERT INTO table1 (toId, teId, dateShift, SectorOrigen) SELECT @StartId + ROW_NUMBER() OVER (ORDER BY teID) - 1 AS toId, teID, @dateModify, @LastSector FROM table2"; connection.Execute(sql, new { StartId = startId, dateModify = yourDateModifyValue, LastSector = yourLastSectorValue });
高并发场景下,这个方法可能出现重复ID,建议加事务或者结合数据库原子操作(比如SQL Server的OUTPUT、PostgreSQL的序列)优化。
方案3:将toId设为数据库自增列(最优解)
如果业务允许,直接把table1的toId字段设为自增列,让数据库自动维护连续序列,无需手动处理:
表结构修改示例(SQL Server)
ALTER TABLE table1 ALTER COLUMN toId INT IDENTITY(1,1);
简化后的插入SQL
var sql = @"INSERT INTO table1 (teId, dateShift, SectorOrigen) SELECT teID, @dateModify, @LastSector FROM table2";
这种方式由数据库负责ID生成,既能避免并发冲突,代码也更简洁。
内容的提问来源于stack exchange,提问作者luis
相关产品推荐
相关产品推荐

