【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录


文章目录
  • 系列文章目录
  • [前言 ??](#前言 ??)
  • 一、实体对象更新
    • [1.1 单条与批量](#1.1 单条与批量)
    • [1.2 不更新某列](#1.2 不更新某列)
    • [1.3 只更新某列](#1.3 只更新某列)
    • [1.4 NULL列不更新](#1.4 NULL列不更新)
    • [1.5 无主键/指定列](#1.5 无主键/指定列)
    • [1.6 更新添加条件](#1.6 更新添加条件)
    • [1.7 大数据更新](#1.7 大数据更新)
    • [1.8 重新赋值1:list中的值修改](#1.8 重新赋值1:list中的值修改)
    • [1.9 重新赋值2: 列中的值+1](#1.9 重新赋值2: 列中的值+1)
  • 二、根据表达式更新(像SQL)
    • [2.1 指定多个字段更新](#2.1 指定多个字段更新)
    • [2.2 一个字段更新](#2.2 一个字段更新)
    • [2.3 字段+1更新](#2.3 字段+1更新)
    • [2.4 Set语法是支持多个的](#2.4 Set语法是支持多个的)
    • [2.5 批量更新IN](#2.5 批量更新IN)
    • [2.6 表达式无实体更新](#2.6 表达式无实体更新)
    • [2.7 表达式分页更新](#2.7 表达式分页更新)
  • 三、根据字典更新
  • 四、根据DataTable更新
  • 五、匿名、Object、接口更新
  • 六、更多功能
    • [6.1 更新主键](#6.1 更新主键)
    • [6.2 联表更新](#6.2 联表更新)
    • [6.3 调用实体内方法](#6.3 调用实体内方法)
    • [6.4 高性能更新](#6.4 高性能更新)
    • [6.5 导航更新](#6.5 导航更新)
    • [6.6 默认值(系统时间)](#6.6 默认值(系统时间))
  • [??? .NET开源 ORM 框架 SqlSugar 系列 ???](#??? .NET开源 ORM 框架 SqlSugar 系列 ???)

前言 ??

前面的章节介绍了各种 SqlSugar 各种场景的 查询 操作,接下来将介绍 SqlSugar 增、删、改 相关操作。数据库 插入 数据的方法包括:使用 SQL 插入语句、通过 ORM 框架、使用 批量插入 技术、利用 存储过程

一、实体对象更新

所谓按实体对象更新就是:db.Updateable (参数对象) 有参数的重载。

复制代码
db.Updateable(实体或者集合).ExecuteCommand()

1.1 单条与批量

根据实体更新需要给实体配置主键,参考文档实体配置:

函数

说明

ExecuteCommand

返回受影响行数 , update where 如果没找到那么就会返回 0

ExecuteCommandHasChange

返回bool ,等同于 bool isChange= ExecuteCommand()>0

复制代码
//根据主键更新单条 参数 Class
var result= db.Updateable(updateObj).ExecuteCommand();//实体有多少列更新多少列

//批量更新参数 List

var result= db.Updateable(updateObjs).ExecuteCommand();

//分页更新 5.1.4.129+ 低版本 存在 UpateColumns设置无效

db.Updateable(List<实体>).PageSize(1000).ExecuteCommand()

var updateObj=new Class(){Id=1 }; //主键要有值

//只更新修改字段 (5.1.4.59支持了批量)

db.Tracking(updateObj);//创建跟踪

updateObj.Name = "a1" + Guid.NewGuid();//只改修改了name那么只会更新name

db.Updateable(updateObj).ExecuteCommand();//因为每条记录的列数不一样,批量数据多性能差,不建议用

//可以清空

db.ClearTracking();//5.1.4.108-preview30+

//大数据批量更新 适合列多数据多的更新

db.Fastest().BulkUpdate(GetList());

复制代码
//联表更新看标题6.2

1.2 不更新某列

??不更新 TestIdCreateTime

复制代码
var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()
 
//也可以用特性
[SugarColumn(IsOnlyIgnoreUpdate=true)]
public DateTime UpdateDate{get;set;}

1.3 只更新某列

??只更新 NameCreateTime

复制代码
var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand();

??注意:5.1.4.62 版本支持了多个 UpdateColumn 叠加,之前版本不支持。

?? 追加AOP赋值列 5.1.4.106-preview19+

复制代码
//例如:AOP修改 Price那么更新的列就是 Price Name Creatime 加了true就追加了一列
var result=db.Updateable(updateObj)
.UpdateColumns(it => new { it.Name,it.CreateTime },true)//true表示追加AOP赋值列
.ExecuteCommand();

1.4 NULL列不更新

??注意:高版本支持批量 ,用该方法批量性能差些,因为列不同所以没必然用批量语法。

复制代码
//更新忽略null字段
db.Updateable(data).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();
 
//更新忽略null并且忽略默认值 (比如int默认值是0就不更新)
db.Updateable(data).
 IgnoreColumns(ignoreAllNullColumns:true,ignoreAllDefaultValue:true).ExecuteCommand();

1.5 无主键/指定列

??用法同上唯一区别就是用 WhereColumns 指定条件:

复制代码
var result= db.Updateable(updateObj).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新单 条根据ID
var result= db.Updateable(updateObjs).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新集合根据ID by id

可以多列:

复制代码
WhereColumns(it=>new { it.Id,it.Name}) //条件列不会被更新,只会作为条件

1.6 更新添加条件

??注意:单条操作都支持 ,批量只支持部分库,多库考虑批量操作不建议用这个方法。

复制代码
db.Updateable(updateObj).Where(it=>it.Id==1).ExecuteCommand()
//如果是集合操作请更新到5.0.4版本之前版本禁止使用, 并且只有部分库支持

1.7 大数据更新

??大数据更新,适合大数据更新,可以处理百万级, 5.0.4.5+

复制代码
//大数据更新,适合大数据更新,可以处理百万级
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//特色功能:吊打所有框架N倍,30列100万8秒更新完

1.8 重新赋值1:list中的值修改

复制代码
 //单个字段
 db.Updateable(updateObj)
   .ReSetValue(it=> { it.Name = it.Name+"a";})//updateObj.Name值的基础上在处理
   .ExecuteCommand()
    
  //多个字段          
 db.Updateable(updateObj)
   .ReSetValue(it=> { 
                it.Name = it.Name+"a";
                it.CreateTime = DateTime.Now;
              })   
     .ExecuteCommand()

??注意:该功能是在 UpdateObj 参数上修改,如果是在数据库字段+1 看1.9和2.3

1.9 重新赋值2: 列中的值+1

  1. SET=字段+固定变量 SqlSugarCore 5.1.4.72 +

    var result67 =

    db.Updateable(updateObjs)

    //批量更新单独处理num列 set num=num+1

    .PublicSetColumns(it => it.Num, it => it.Num+ 1)

    .ExecuteCommand();

    //该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下

    //2.3也有该功能不过是针对表达式方式更新,不是通过实体方式

??注意:该功能默认是更新整个LIST,如果只更新一个字段需要加 UpdateColumn 指定一下。

  1. SET=字段+集合变量 SqlSugarCore 5.1.4.77 preview02 +

    db.Updateable(list)

    .PublicSetColumns(it => it.Price, "+") //set price=price+list[i].price

    .ExecuteCommand();//MYSQL如果用到float表要设置精度

    //该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下

??注意:该功能默认是更新整个LIST,如果只更新一个字段需要加 UpdateColumn 指定一下。

二、根据表达式更新(像SQL)

??表达式更新比较像SQL而不是对象。

复制代码
var result=db.Updateable<Student>()
          .SetColumns(it => new Student() { Price=it.Price+1,CreateTime=DateTime.Now}) 
          .Where(it => it.Id >11)
          .ExecuteCommand();
//是不是很像SQL

2.1 指定多个字段更新

??更新 name, createtime 条件 id=11

复制代码
var result= db.Updateable<Student>()
.SetColumns(it => new Student() { Name="a",CreateTime=DateTime.Now})//类只能在表达示里面不能提取
.Where(it => it.Id == 11)
.ExecuteCommand();
//表达式写2列更新2列,其他不会更新

2.2 一个字段更新

??只更新 name 条件 id=1

复制代码
var result= db.Updateable<Student>()
.SetColumns(it => it.Name == "jack")//SetColumns是可以叠加的 写2个就2个字段赋值
.Where(it => it.Id == 1)
.ExecuteCommand();
 
// Sql 
// Update Student  set Name='jack' where id=1 
 
//如果需要获取数据库时间我们可以用 SqlFunc.GetDate()

??注意:如果需要获取数据库时间我们可以用 SqlFunc.GetDate()

2.3 字段+1更新

复制代码
//实现在原有字段+1
var result= db.Updateable<Student>()
.SetColumns(it => it.Num == it.Num+1)
.Where(it => it.Id == 1)
.ExecuteCommand();
// update Studentset iNum=iNum+1 where id=1

2.4 Set语法是支持多个的

复制代码
var result71 = db.Updateable<Order>()
               //生成 [name]=name
              .SetColumns(it => it.Name == it.Name)//加一个必须更新条件防止SETIF没有列
              //第一条件为true 生成 createtime=变量 
              .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)
               //第一条件为true 生成 X=变量 
              .SetColumnsIF(X!=null ,it => it.X== X)
              .Where(it => it.Id == 11).ExecuteCommand();

2.5 批量更新IN

复制代码
var ids=new int[]{1,2,3};
var result71 = db.Updateable<Order>()
             .SetColumns(it => it.Name == "a")
            .Where(it => ids.Contains(it.Id)).ExecuteCommand();
            // in (1,2,3)

2.6 表达式无实体更新

复制代码
db.Updateable<object>()
         .AS("Order")
         .SetColumns("name", 1)
         .Where("id=1").ExecuteCommand();
                 
  //SQL:
  //UPDATE [Order]  SET
  //         [Name]=@Const0  WHERE id=1

//新功能 5.1.4.143+

db.Updateable()//需要升到5.1.4.143

.AS("UserInfo001")

.SetColumns(it=>SqlFunc.MappingColumn("price"),it=>SqlFunc.MappingColumn("price+1"))

.Where("price=1")

.ExecuteCommand();

复制代码
  //UPDATE [UserInfo001]  SET
  //        [price]=price+1   WHERE price=1

2.7 表达式分页更新

复制代码
var q=db.Queryable<Order>()
    .Take(10).Skip(10).OrderByDescending(it => it.CreateTime) 
    .Select(it => it.Id);//只能是Select单个字段
     
db.Updateable<Order>().SetColumns(it => new Order()
    {
        CreateTime = DateTime.Now
    })
    .In(it => it.Id,q).ExecuteCommand();

三、根据字典更新

复制代码
//设置字典
var dt = new Dictionary<string, object>();
            dt.Add("id", 1);
            dt.Add("name", null);
            dt.Add("createTime", DateTime.Now);
var t66 = db.Updateable(dt).AS("student").WhereColumns("id").ExecuteCommand();
 
//字典集合
var dtList = new List<Dictionary<string, object>>();
dtList.Add(dt);
dtList.Add(dt2);
var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();

四、根据DataTable更新

datatable 转成字典集合插入

复制代码
List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//转成字典
var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();

五、匿名、Object、接口更新

匿名对象:https://www.donet5.com/Home/DoctypeId=2423

Object、接口和抽象类:

复制代码
//这个object必须真实类对象,比如反射的Object 或者接口接收的类对象
db.UpdateableByObject(object).ExecuteCommand();
 
//更多功能 :动态建类等
https://www.donet5.com/Home/Doc?typeId=2562

六、更多功能

6.1 更新主键

??注意:ORM 默认不支持修改主键,这种需求有2种方案:

  1. 删除当前记录,然后在添加一条新记录(因为主键都可以更新,说明没有外部引用,可以直接删掉在加)

  2. 新建一个没有主键的实体,指定表名用 Wherecolumns 更新

6.2 联表更新

复制代码
//多库兼容
var t17 = db.Updateable<Student>()
        .SetColumns(it =>new Student()
        { 
          SchoolId=SqlFunc.Subqueryable<School>().Where(s=>s.Id ==it.SchoolId).Select(s=>s.Id), 
           Name = "newname"  
         })
         .ExecuteCommand();
      //也可以在Where加条件
      //.Where(it => SqlFunc.Subqueryable<School>().Where(s => s.Id == it.SchoolId).Any())

//优雅写法:MySql PgSql SqlServer Oracle 达梦、金仓

//其中Oracle和达梦只支持2表

var t= db.Updateable()

.InnerJoin((x, y) => x.CustomId == y.Id)

.SetColumns((x, y) => new Order() { Name = y.Name, Price = y.Id })

.Where((x, y) => x.Id == 1)

.ExecuteCommand();

??生成 sql

复制代码
UPDATE [STudent]  SET            
[SchoolId] = (SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) ,             
[Name] = @Const0   
WHERE ( [ID] = @Id1 )

6.3 调用实体内方法

复制代码
 db.Insertable(new UnitInsertMethod() { ...... })
 .CallEntityMethod(it=>it.Create()).ExecuteCommand();
  
 db.Updateable(new UnitInsertMethod() { ..... })
 .CallEntityMethod(it => it.modify("admint")).ExecuteCommand();
 
//实体 
public class UnitInsertMethod
{
    [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Time { get; set; }
    [SqlSugar.SugarColumn(IsNullable =true)]
    public string UserId { get; set; }
  
    public void Create()
    {
        this.Time = DateTime.Now;
        this.UserId = "1";
    }
    public void modify(string a)
    {
        this.Time = DateTime.Now;
        this.UserId = a;
    }
} 

6.4 高性能更新

适合超大数据更新

复制代码
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//更新 吊打所有框架N倍,30列100万8秒更新完

6.5 导航更新

https://www.donet5.com/Home/Doc?typeId=2432

6.6 默认值(系统时间)

方式1 (5.1.3.42-preview01):通过特性指定默认值

复制代码
  //更新取数据库当前时间 支持多库
  //UpdateServerTime =true 更新的时候取服务器时间
  //IsOnlyIgnoreInsert =true 插入的时候不插入该列(可用可不用根据需求来)
  [SugarColumn(UpdateServerTime =true,IsOnlyIgnoreInsert =true)]// getdate() now() sysdate
  public DateTime UpdateTime { get; set; }

//更新根据SQL进行插入

SugarColumn(UpdateSql = "getdate()")\] //生成 getdate() public DateTime UpdateTime2 { get; set; } [SugarColumn(UpdateSql = "''")] // 生成 '' public string Str { get; set; } [SugarColumn(UpdateSql = "0")]// 生成 0 public string Str { get; set; } [SugarColumn(UpdateSql = "num+1")]// 生成 num+1 public string num { get; set; } **??注意:** * 表达更新:SetColumns(it=\>new class{ name=it.name},true) 如果用到 `SetColumn` 需要加个true。 * 实体更新:无需任何操作。 * 方式2:通过 `AOP` 实现,文档搜索:AOP , 看标题2。 * 注意:方式1和方式2不要冲突了。 *** ** * ** *** ### ??? .NET开源 ORM 框架 SqlSugar 系列 ??? [【开篇】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144094257) [【入门必看】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144096895) [【实体配置】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144119593) [【Db First】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144123069) [【Code First】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144120584) [【数据事务】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144145729) [【连接池】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144146611) [【查询目录】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144160378) [【查询基础】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144160584) [【排序用法】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144163538) [【分组去重】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144163270) [【联表查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144167460) [【导航查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144179575) [【子查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144197515) [【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144198435) [【配置查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144252050) [【并集查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144278582) [【树型查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144290164) [【表格查询】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144311924) [【动态表达式】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144312331) [【查询函数】.NET开源ORM框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144356680) [【过滤器】.NET开源 ORM 框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144408963) [【跨库查询、多库查询】.NET开源 ORM 框架](https://lisaisai.blog.csdn.net/article/details/144438972) [?【报表查询】.NET开源ORM框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144593267) [【Where语法全解密】.NET开源ORM框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144618502) [【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列](https://blog.csdn.net/mss359681091/article/details/144647471) [【查询返回结果类型】.NET开源ORM框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144754628) [【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144895150) [【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列](https://lisaisai.blog.csdn.net/article/details/144895980) *** ** * ** *** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e19c111e2e544fe4987dbcddb20cf78f.jpeg)

相关推荐
JEECG低代码平台2 小时前
【2025/11】GitHub本月热度排名前十的开源Java项目
java·开源·github
q***82913 小时前
开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)
开源·交互·fastapi
optimistic_chen3 小时前
【Java EE进阶 --- SpringBoot】AOP原理
spring boot·笔记·后端·java-ee·开源·aop
ajassi20005 小时前
开源 Objective-C IOS 应用开发(十四)传感器--陀螺仪和gps
ios·开源·objective-c
葛小白15 小时前
Labview实用04:Labview调用.net中的事件
.net·labview
HelloGitHub7 小时前
节省 60% Token 的新数据格式「GitHub 热点速览」
开源·github
唐青枫8 小时前
.NET Web 应用 Linux 部署全指南:从环境搭建到生产上线
c#·.net
xixixi7777714 小时前
了解一下Sentry(一个开源的实时错误监控平台)
前端·安全·开源·安全威胁分析·监控·sentry
q***710116 小时前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源