精华内容
下载资源
问答
  • 2021-06-19 16:06:54

    一、表结构

    CREATE TABLE `t_user` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
      `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `unique_name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

    二、插入时通过where条件查询该条记录是否已经存在(通过子查询先查询数据是否存在)

    INSERT INTO t_user ( NAME, sex ) SELECT
    '小明',
    '男' 
    FROM
    DUAL 
    WHERE
    	NOT EXISTS ( SELECT NAME, sex FROM t_user WHERE NAME = '小明' );

    三、使用REPLACE语句(自动查询 主键或索引冲突,如有冲突,会先删除原有的数据,然后插入新的数据)(因为先删除,自增主键会更改

    REPLACE INTO t_user ( NAME, sex )
    VALUES
    	(
    		'小明1',
    	'男' 
    	)

    四、使用ON DUPLICATE KEY UPDATE(推荐)(能够更灵活的设置更改时想要改变的字段)

    INSERT INTO t_user ( NAME, sex )
    VALUES
    	( '小明2', '男' ) 
    	ON DUPLICATE KEY UPDATE sex = '男'

    注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

    更多相关内容
  • Mysql有则更新无则新增的几种方案

    千次阅读 2020-10-21 00:08:38
    两种方案对比 INSERT ··· ON DUPLICATE KEY UPDATE冲突时是将原记录更新,REPLACE INTO是删除记录重建,所以性能上前者是优势的。 尽管如此,当并发量太高时,依旧不推荐使用INSERT ··· ON DUPLICATE KEY ...

    环境准备

    mysql版本:
    5.7.29

    测试表创建及初始化:

    --建表
    CREATE TABLE `test_user` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
      `uid` bigint(20) unsigned NOT NULL COMMENT '用户id',
      `name` varchar(128) NOT NULL COMMENT '用户名',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_uid` (`uid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='人员表';
    --初始化数据
    insert into test_user(id, uid, name) values (1,10001,'lzc'),(2,10002,'lxx'),(3,10003,'abc');
    --查询初始化后的数据
    mysql> select * from test_user;
    +----+-------+------+
    | id | uid   | name |
    +----+-------+------+
    |  1 | 10001 | lzc  |
    |  2 | 10002 | lxx  |
    |  3 | 10003 | abc  |
    +----+-------+------+
    3 rows in set (0.00 sec)
    

    方案一:INSERT ··· ON DUPLICATE KEY UPDATE

    在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新记录插入操作。另外,ON DUPLICATE KEY UPDATE不能写where条件。

    唯一索引不重复,执行插入

    insert into test_user(id, uid, name) values (4,10004,‘lzc’) ON DUPLICATE KEY UPDATE name = concat(name , name);

    mysql> insert into test_user(id, uid, name) values (4,10004,'lzc') ON DUPLICATE KEY UPDATE name = concat(name , name);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test_user;
    +----+-------+------+
    | id | uid   | name |
    +----+-------+------+
    |  1 | 10001 | lzc  |
    |  2 | 10002 | lxx  |
    |  3 | 10003 | abc  |
    |  4 | 10004 | lzc  |
    +----+-------+------+
    4 rows in set (0.00 sec)
    

    唯一索引重复,执行更新,但更新值与原值不相同

    insert into test_user(id, uid, name) values (5,10001,‘lzc’) ON DUPLICATE KEY UPDATE name = concat(name , name);

    mysql> insert into test_user(id, uid, name) values (5,10001,'lzc') ON DUPLICATE KEY UPDATE name = concat(name , name);
    Query OK, 2 rows affected (0.01 sec)
    
    mysql> select * from test_user;
    +----+-------+--------+
    | id | uid   | name   |
    +----+-------+--------+
    |  1 | 10001 | lzclzc |
    |  2 | 10002 | lxx    |
    |  3 | 10003 | abc    |
    |  4 | 10004 | lzc    |
    +----+-------+--------+
    4 rows in set (0.00 sec)
    

    唯一索引重复,执行更新,但更新值与原值相同

    insert into test_user(id, uid, name) values (2,10002,‘lxx’) ON DUPLICATE KEY UPDATE name = ‘lxx’;

    mysql> insert into test_user(id, uid, name) values (2,10002,'lxx') ON DUPLICATE KEY UPDATE name = 'lxx';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from test_user;
    +----+-------+--------+
    | id | uid   | name   |
    +----+-------+--------+
    |  1 | 10001 | lzclzc |
    |  2 | 10002 | lxx    |
    |  3 | 10003 | abc    |
    |  4 | 10004 | lzc    |
    +----+-------+--------+
    4 rows in set (0.01 sec)
    

    方案二:REPLACE INTO

    这中语法会自动查询主键或索引冲突,如有冲突,他会先删除原有的数据记录,然后执行插入新的数据。
    replace into test_user(uid, name) values (10003,‘def’) ;

    mysql> replace into test_user(uid, name) values (10003,'def') ;
    Query OK, 2 rows affected (0.01 sec)
    
    mysql> select * from test_user;
    +----+-------+--------+
    | id | uid   | name   |
    +----+-------+--------+
    |  1 | 10001 | lzclzc |
    |  2 | 10002 | lxx    |
    |  4 | 10004 | lzc    |
    |  6 | 10003 | def    |
    +----+-------+--------+
    4 rows in set (0.01 sec)
    
    

    两种方案对比

    INSERT ··· ON DUPLICATE KEY UPDATE冲突时是将原记录更新,REPLACE INTO是删除记录重建,所以性能上前者是有优势的。
    尽管如此,当并发量太高时,依旧不推荐使用INSERT ··· ON DUPLICATE KEY UPDATE,会存在死锁问题,死锁现象描述如下:
    对于INSERT ON DUPLICATE UPDATE操作,当两个会话S1和S2使用INSERT ON DUPLICATE UPDATE语句操作相同数据且表中存在相同键值记录时,触发死锁场景为:

    1. 由于表中已存在重复键值的记录,导致会话先后尝试INSER失败
    2. 会话S1进入步骤3尝试获取记录的S锁,该记录未被其他会话加锁,获取S锁成功。
    3. 会话S2进入步骤3尝试获取记录的S锁,该记录上被加持S锁,但由于S锁与S锁兼容,获取S锁成功
    4. 会话S1进入步骤4尝试获取记录的X锁,由于会话S2对该记录持有S锁,S锁与X锁不兼容,获取X锁失败,会话S1被阻塞
    5. 会话S2进入步骤4尝试获取记录的X锁,由于会话S1对该记录持有S锁,S锁与X锁不兼容,获取X锁失败,会话S2被阻塞
    6. 会话S2被阻塞后进入死锁检查环节,发现阻塞S1->S2和S2->S1形成死锁环路,触发死锁机制强制回滚S1或S2事务。
    

    参考文章
    https://www.cnblogs.com/zjfjava/p/10296867.html

    https://blog.csdn.net/jiangying09/article/details/47418439

    https://blog.csdn.net/leaves_story/article/details/89373555?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

    展开全文
  • Java之ES之文档有则更新无则新增 转https://blog.csdn.net/qq_32403063/article/details/102461731

    Java之ES之文档有则更新无则新增
    转https://blog.csdn.net/qq_32403063/article/details/102461731
    在这里插入图片描述

    展开全文
  • 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,把B表的数据插入A表。 1、Merge into的基本语法 MERGE INTO [表名] [表别名] USING ( [查询...

    一、Oracle、Sqlserver数据库:(merge into)

    通过Merge into你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表。

    1、Merge into的基本语法

    	MERGE INTO [表名] [表别名] 
    	USING ( [查询内容] )[或者像表查询一样的语句] 
    	ON ([条件表达式] AND [...]...) 
    	WHEN MATHED THEN [匹配的update操作] 
    	WHEN NOT MATHED THEN [不匹配的insert操作] 
    

    例:

    	MERGE INTO  UAM_LOCK  A
    	USING (SELECT '123' as CUSTOMERID, 'L' as STATUS_CODE FROM dual) B on (A.CUSTOMERID=B.CUSTOMERID)
    	WHEN MATCHED THEN UPDATE SET A.STATUS-CODE=B.STATUS_CODE
    	WHEN NOT MATCHED THEN  INSERT (A.CUSTOMERID, A.STATUS_CODE) VALUES (B.CUSTOMERID, B.STATUS_CODE )
    

    注意事项:

    Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。

    所以要想让Merge Into正常运行,要保证USING 后面的SELECT有数据,个人喜欢使用DUAL表作为USING后的表,方便自己控制。

    二、Mysql数据库:

    1、REPLACE INTO
    发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。

    replace into uam_lock(customerid,status_code) select '123','L';
    或
    replace into uam_lock(customerid,status_code) values('123','L');
    

    注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

    2、INSERT INTO ON DUPLICATE KEY UPDATE
    发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。

    insert into uam_lock(customerid,status_code) values('123','L') on DUPLICATE KEY UPDATE status_code=‘O’;
    

    注意:要给唯一字段加上索引,类型为:UNIQUE

    3、IGNORE INTO
    判断是否存在,存在不插入,否则插入。

    insert ignore into uam_lock(customerid,status_code) values('123','L');
    

    当执行这条sql语句时,如果数据库中已经存在相同的记录,则数据库会忽略该条命令,返回的受影响的行数为0。

    展开全文
  • Oracle语句实现有则更新无则插入

    千次阅读 2018-03-12 09:50:08
    在使用Oracle数据库之前,我是用的是Mysql数据库,知道Mysql数据库实现有则更新无则更新,是一条语句的, 但是Oracle实现此功能却一时让我顿感无措,但是我坚信oracle数据库一定会提供此类语句。 于是。。。1...
  • 非常不错的功能,主要用于更新特定的记录,如果存在这条记录则更新一下,如果不存在则插入记录。应用于配置文件等。
  • Mybatis 通过 DUPLICATE 实现则修改,无则新增
  • 通过sql实现无则插入有则修改(MySQL)

    千次阅读 2021-01-19 23:42:00
    如果在数据库中相应的记录,那么将对应的记录更新为最新数据。通常情况下,我们会先通过条件去数据库查一次,根据返回的结果,如果为空执行insert动作,如果不为空执行update动作,这样的做法难免显得有些...
  •  我们操作数据的时候时候需要根据某一字段实现就修改此条数据,没有就新增此条数据 实现:  INSERT INTO test_qiaorui (ID,NAME,sex,email,city,DATE,hobby,DESCRIBE) VALUES ('1','postgre','女','123','...
  • Mybatis 使用ON DUPLICATE KEY UPDATE 实现则修改,无则新增
  • mybatis有则更新无则插入

    千次阅读 2019-12-14 19:46:12
    前提条件必须要主键或者唯一索引 #{id,jdbcType=INTEGER} <insert id="addArticle" parameterType="com.rui.mall.db.bean.Article"> INSERT into article_manage (id,titl...
  • 某些场景会这样的需求:记录则插入,记录则更新。例如:新增用户,以身份证号码作为唯一身份标识,插入时若先查询是否存在记录再决定插入还是更新,在高并发情况下必然存在问题。本文提供三种解决方案。 方案...
  • Postgresql SQLite 新增和修改是同一个语句 有则更新 无则新增 使用 CONFLICT Postgresql SQLite 新增和修改是同一个语句 有则更新 无则新增 使用 CONFLICT
  • Mybatis 有则更新则插入代码案例

    千次阅读 2021-03-30 15:26:31
    想插入数据库一条记录,如果这条记录的主键已存在,则更新这条记录,如果主键不存在,则新增这条记录。 用Mybatis实现,使用ON DUPLICATE KEY UPDATE <insert id="insertUser" keyProperty="id" keyColumn="id" ...
  • 假设一张demo表,主键为id,唯一索引是code create table demo ( id int auto_increment, name int null, gender int null, age int null, code int null, constraint demo_pk primary key (id) ); ...
  • mybatis+mysql (有则更新则插入)

    千次阅读 2019-01-24 09:27:29
    -- 批量更新 --> insert into virtualMachines ( `name`,`status`,`state`,`hostCPU`,`hostMemory`,`provisionedSpace`,`usedSpace`,`ip`,`isFtpInstalled` ) values separator=","> ( #{...
  • 1、mybatis批量更新使用foreach 代码如下: @Update("&lt;script&gt;" + "&lt;foreach collection='list' separator=';' item='user' &gt;" + "UPDATE users SET &...
  • mybatis实现有则更新无则插入

    千次阅读 2019-03-29 16:48:00
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="com.foreigners.entity.User"> insert INTO t_user(openId, name...
  • Mybatis 有则更新则插入的实现

    万次阅读 2018-10-08 16:07:16
    想插入数据库一条记录,如果这条记录的主键或者Unique键已存在,则更新这条记录,如果主键或Unique键不存在,则新增这条记录。用Mybatis实现。网上有些方法说用replace into,但是mybatis是不支持的。所以,必须使用...
  • MySQL中有则更新则插入的语法

    千次阅读 2018-12-14 19:35:01
    MySQL中有则更新则插入的语法举例说明:举例:说明:触发条件:实际使用:注意事项: 举例说明: 举例: 例如:字段a被定义为UNIQUE,并且原数据库表table中已存在记录(2,2,9)和(3,2,1),如果插入记录的a值与...
  • insertAll里面个replace参数,操作之后发现,即使这个参数设置成true,最后的执行结果是直接把已经存在的数据删除后再插入的,相当于先delete再insert.这样导致一些不需要更新的字段也不存在了. 在网上找到一个 ON ...
  • 在 Java 中打印出了执行SQLJDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@453762db] will not be managed by Spring==> Preparing: insert INTO orderdetail ( id, mainid, ordercode ) ...
  • 我们可能在业务中会遇到增加一条记录,如果改记录存在的话,就更新里面的一些字段,如果没有查询 1,增加唯一的约束(如果不是通过id) alter table realtime_inventory add unique(sku,store_id); //建立唯一...
  • 如果在Oracle 表value_dazong_index_mom_day(在table里存起来了),它所有字段值的更新依据表DZWWW_MOM(根据原始数据建立起的视图),这里假设这两张表的结构完全一样(事实上可以不一样,只需第一个表要更新的...
  • 一张表,id为主键,现在在数据库中插入数据,如果存在firstName、lastName相同的数据,则更新count,不存在这插入数据。 例如:已数据中,已存在 firstName 为 Jack,lastName 为 Li 的数据,则原有数据不新增,只...
  • mybatis存在更新不存在新增

    千次阅读 2022-02-16 15:18:54
    1 主键或者唯一索引,相同的字段进行添加时进行其他字段更新,否则进行新增 <insert id="insertFwdcBlacklist" parameterType="com.qujie.mintwo.life.fwdc.entity.FwdcBlacklist"> insert into fwdc_...
  • peewee 实现 有则更新则插入.

    千次阅读 2019-11-07 15:19:01
    背景:想用peewee实现 mysql数据库 有则更新则插入.几番查找,发现在官方文档中.下图: 在本地的数据库测试了,以下是测试语句及结果: 表结构 class Practice(Model): id = AutoField(primary_key=True) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 244,041
精华内容 97,616
关键字:

无则新增 有则更新