首页 > 其他分享 >golang grom 实现 INSERT...ON DUPLICATE KEY UPDATE

golang grom 实现 INSERT...ON DUPLICATE KEY UPDATE

时间:2023-09-30 20:56:31浏览次数:45  
标签:INSERT KEY grom UPDATE DUPLICATE VALUES user ...

内容来自对 chatgpt 的咨询

前言(INSERT...ON DUPLICATE KEY UPDATE 介绍)

当你在MySQL中插入数据,如果唯一键发生冲突,可以使用 INSERT...ON DUPLICATE KEY UPDATE 语句实现插入和更新操作。其基本语法如下:

INSERT INTO table (col1, col2, ...colN)
VALUES (value1, value2, ...valueN)
ON DUPLICATE KEY UPDATE
col1 = value1, col2 = value2, ...colN = valueN;

这条语句的逻辑是:如果插入的记录与表中现有记录的唯一索引或主键冲突,那么就执行 UPDATE 操作。如果没有冲突,那么就执行 INSERT 操作。

例如,表users有唯一键user_id,现在想插入或更新一条 user_id=1 的记录:

INSERT INTO users (user_id, user_name, user_email)
VALUES (1, 'John', '[email protected]')
ON DUPLICATE KEY UPDATE
user_name='John', user_email = '[email protected]';

在以上的例子中,如果 user_id=1 的这条记录已经存在,在执行此语句后,user_name 和 user_email 会被更新为新的值。如果 user_id=1 的记录不存在,那么这个语句就会新插入一条记录。

注意

在 ON DUPLICATE KEY UPDATE 后面的赋值表达式中,你不能使用 VALUES(col) 获取插入语句中的值,因为它可能被认为是值的字面量而不是列表的值。你应该直接使用要输入的值或者变量。

在 grom 中使用 mysql 的这种语法效果

可以使用GORM的 Exec() 函数,执行自定义的SQL语句来实现MySQL的 INSERT...ON DUPLICATE KEY UPDATE 功能。下面这段代码段会尝试插入users数组中的每个用户,并在发生主键冲突的情况下,更新冲突数据的user_name和user_email字段。需要注意的是,VALUES(user_name), VALUES(user_email)中的VALUES函数能引用到插入时的真实数据,占位符会被替换成真实数据。

users := []User{
    {UserID: 1, UserName: "John1", UserEmail: "[email protected]"},
    {UserID: 2, UserName: "John2", UserEmail: "[email protected]"},
    {UserID: 3, UserName: "John3", UserEmail: "[email protected]"},
}

valueStrings := []string{}
valueArgs := []interface{}{}

// 构造插入语句和冲突时的更新语句
for _, user := range users {
    valueStrings = append(valueStrings, "(?, ?, ?)")
    valueArgs = append(valueArgs, user.UserID)
    valueArgs = append(valueArgs, user.UserName)
    valueArgs = append(valueArgs, user.UserEmail)
}

stmt := fmt.Sprintf("INSERT INTO users (user_id, user_name, user_email) VALUES %s"+
    "ON DUPLICATE KEY UPDATE user_name=VALUES(user_name), user_email=VALUES(user_email)",
    strings.Join(valueStrings, ","))

db.Exec(stmt, valueArgs...)

注意点

  • 注意使用这种方法时要确保你对用户的数据有100%的信任,或者已经进行了相应的清理,以防止SQL注入攻击。

  • 在执行 SQL 语句之前,需要检查 users 数组是否为空。原因是如果 users 长度为0,则跳过构造和执行 SQL 语句的步骤。如果 users 数组为空,那么在构造 SQL 插入语句的过程中,valueStrings 和 valueArgs 切片都将保持为空。这意味着 stmt 字符串将尝试插入空的值,形如:INSERT INTO users VALUES ON DUPLICATE KEY UPDATE,这将导致 SQL 语法错误,因为在 "VALUES" 关键字后并未提供任何数据。

标签:INSERT,KEY,grom,UPDATE,DUPLICATE,VALUES,user,...
From: https://www.cnblogs.com/hi3254014978/p/17738201.html

相关文章

  • maven 编译.../maven-metadata.xml 报错
    问题突然编译报错:解决打开maven的里离线工作模式,感觉就是下载包到本地.一个是在maven设置里面或者直接在maven编译的窗口:......
  • AtCoder Regular Contest 123 F Insert Addition
    洛谷传送门AtCoder传送门用\((x,y)\)表示\(Ax+By\),那么这个等价于SB树。那么直接在SB树上二分,遍历一遍找到\(n\)个点就好了。可以采用类似线段树查询的方式。于是现在还剩下一个子问题:给定\(a,b\),求\(ax+by\len\)且\(\gcd(x,y)=1\)的正整数\((x,y......
  • uniapp自动引入Vue3(ref,reactive...)的API、uniapp生命周期和封装hooks
    未自动导入Vue3(ref,reactive...)的API和uniapp生命周期,需要在每个页面把API和uniapp生命周期的代码都重复写一遍<scriptsetup>import{ref,reactive}from"vue"import{onLaunch,onShow,onHide}from'@dcloudio/uni-app'//封装的hooksimport{useLi......
  • IntelliJ IDEA中执行@Test单元测试时报错Class not found: "..."终极办法
    之前也出现过在编译时找不到测试类的问题,但之前的那篇博文,并不是终极办法IntelliJIDEA中执行@Test单元测试时报错Classnotfound:"..."Emptytestsuite 问题:出现类似问题,普遍时同然就报错了,原因是使用IDEA,从别人的Git上拉取代码后,别人把一些idea的配置文件也传上了,到时更新......
  • SyntaxError: invalid property id (浏览器不支持对象...展开)
    SyntaxError:invalidpropertyid(浏览器不支持对象...展开)火狐55以后支持......
  • 一些SQL小技巧,不定期更新...
    要将查询结果作为IN语句的查询条件,查询结果作为子查询,并在主查询中使用IN子句。SELECTtable_idsFROMcdc_table_syncWHEREsync_id='FLINK_CDC_SYNC_TABLE_198';结果为:c2a9f78ecc3f6a6c97c12956d25e1adc,24d883d4a419578d09dd3801f001b93e,f3e569a5c68023c76b5bb2......
  • donet 常用命令汇总......
    dotnetnew:用于创建新的.NET项目。示例:创建一个名为"MyConsoleApp"的控制台应用程序项目。dotnetnewconsole-nMyConsoleAppdotnetbuild:用于构建.NET项目。示例:构建当前目录中的项目。dotnetbuilddotnetrun:用于运行.NET应用程序。示例:......
  • 解决ubuntu进入tty1...6后显示中文乱码的问题
    一、临时解决(足够)例如,进入tty2,查看$LANG和$LANGUAGE:$echo$LANGzh_CN.UTF-8;是什么不重要,这里主要是反映修改前后的不同$echo$LANGUAGEzh_CN:zh:en_US:en;是什么不重要,这里主要是反映修改前后的不同实验一下没有修改前的tty的输出:$rmfilerm:###&&**乱码修改设置,......
  • 解决pycharm报错:_jb_pytest_runner.py:7:....from pkg_resources import iter_entry_p
    遇到问题执行pytest用例出现警告D:\pycharm\PyCharm2020.1.5\plugins\python\helpers\pycharm_jb_pytest_runner.py:7:DeprecationWarning:pkg_resourcesisdeprecatedasanAPI.Seehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimport......
  • postgresql的insert语句中进行判断,数据已有则更新,数据没有则插入
    INSERT操作INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,...);下面是一个示例:INSERTINTOemployee(id,name,salary)VALUES(1,'JohnDoe',5000); INSERT或UPDATE操作在执行insert的时候进行判断,根据情况进行insert或者update操作,......