insert忽略重复、mysql插入操作跳过、插入覆盖覆盖、mysql更新重复

本文介绍在SQL中处理数据冲突的四种方法:insert ignore into、on duplicate key update、insert...select...where not exist及replace into。这些技巧能帮助解决数据插入时的主键重复问题,适用于不同的业务场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求背景:
一般情况,插入数据的时候,有脏数据的情况,主键重复的话,直接insert into 会报错的,然后下面的sql都不再执行了,如果可以确定后面的数据可以覆盖前面的数据,直接用replace into 就行了。一般情况我用这个比较多,其余情况请看下面文章。

1.insert ignore into

当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:

INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')
INSERT IGNORE INTO books (name) VALUES ('MySQL Manual'),('NGINX Manual'),('REDIS Manual')

2.on duplicate key update
当primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。例如,为了实现name重复的数据插入不报错

INSERT INTO books (name) VALUES ('MySQL Manual') ON duplicate KEY UPDATE id = id

3.insert … select … where not exist
根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

4.replace into
如果存在primary or unique相同的记录,则先删除掉。再插入新记录。注意若原记录存在(a1,b1,c1),新记录为(a1,b2),则replace后c字段为null

REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

原文地址:http://www.cnblogs.com/sweet521/p/5730804.html

### MySQL 插入数据时跳过重复主键的方法 在 MySQL 数据库中,当需要插入数据并遇到重复主键的情况时,可以使用 `INSERT IGNORE INTO` 来实现忽略冲突的功能。这种方法不会抛出错误提示,而是通过警告的方式处理唯一键或主键冲突的问题。 以下是关于该功能的具体说明以及其实现方式: #### 使用 INSERT IGNORE INTO 跳过重复主键 `INSERT IGNORE INTO` 是一种特殊的插入语句,在执行过程中如果发现违反唯一约束(如主键或唯一索引),它会选择忽略这些记录而不中断整个事务[^2]。例如,假设有一张名为 `test5` 的表,其结构如下: ```sql CREATE TABLE test5 ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); ``` 尝试向此表插入一条已存在的主键值的数据时,可以通过以下 SQL 实现忽略冲突的效果: ```sql INSERT IGNORE INTO test5 (id, name, age) VALUES(1, 'John', 1); ``` 上述命令会在检测到主键冲突的情况下仅发出警告而继续运行其他无冲突的操作[^3]。 #### 替代方案对比分析 除了 `INSERT IGNORE INTO` 外,还有两种常见的替代方法用于处理重复主键问题——分别是 `REPLACE INTO` 和 `ON DUPLICATE KEY UPDATE`: - **Replace Into**: 此语法的特点在于当发生 PK 或 UK 冲突时,不是简单地丢弃新纪录,而是删除旧记录后再重新插入新的记录[^5]。需要注意的是,这种做法可能会改变自增列的行为模式,并且对于某些业务场景可能并不适用。 - **On Duplicate Key Update**: 如果希望保留原有记录的同时更新部分字段,则可以选择这种方式来代替完全替换或者单纯忽视新增请求的情形[^1]。比如下面的例子展示了如何只修改年龄属性而不是覆盖整条记录: ```sql INSERT INTO test5 (id, name, age) VALUES(1, 'John', 2) ON DUPLICATE KEY UPDATE age=VALUES(age); ``` 综上所述,针对不同的需求背景应该选取合适的策略应对可能出现的主键重复状况;其中,“Insert Ignore”因其简洁明了且易于理解成为很多开发者首选解决方案之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值