on duplicate key update----unique索引实现唯一性

一  关键字 on duplicate key update的介绍

1.1 介绍

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

原理是:

该语法会在插入数据之前判断,如果主键或唯一索引不存在,则插入数据。如果主键或唯一索引存在,则执行更新操作。

需要注意的是,在高并发的场景下使用on duplicate key update语法,可能会存在死锁的问题,所以要根据实际情况酌情使用。

1.2 实操案例

本案例:使用unique索引结合ON DUPLICATE KEY UPDATE语句实现,添加数据确保数据的唯一性,不重复,有则修改,没有则新添加。

1.新建表

id为为主键,name+sex组合成索引

2.执行sql语句

再次执行:

两次执行结果:可以看到实现了"有则修改,无则新添加"的效果

`INSERT INTO ... ON DUPLICATE KEY UPDATE` 是一种SQL语句模式,它用于在插入新记录时如果发现主键(或其他唯一索引)已经存在,则更新那些已存在的字段,而不是插入一个新的记录。这种机制通常用于实现某种形式的数据复制或同步。 然而,有以下几个原因可能促使禁用这个特性: 1. **数据一致性**:在一个事务中执行 `INSERT` 和 `UPDATE` 可能导致数据不一致。如果插入失败,`ON DUPLICATE KEY UPDATE` 操作可能会继续进行,导致部分更新的数据与预期不符。因此,在某些情况下,禁用它可以强制执行更严格的事务管理。 2. **性能**:频繁的更新操作可能导致表锁定,影响并发性能。如果数据库设计得当,不需要频繁地通过 `ON DUPLICATE KEY UPDATE` 来修改现有记录,那么禁用这个选项可以提高系统的响应速度。 3. **业务逻辑**:有些场景下,比如希望始终保持数据的一致性状态,或者插入操作总是创建新的实体,而不允许覆盖现有数据,那么就应该明确禁止 `ON DUPLICATE KEY UPDATE`。 4. **审计追踪**:禁用这个功能可以帮助简化日志跟踪,因为不会混淆插入和更新的操作。 要完全禁用 `ON DUPLICATE KEY UPDATE`,可以在创建表的时候定义主键或唯一索引,并设置其 `ON UPDATE` 或 `ON DELETE` 为 `NO ACTION` 或 `RESTRICT`,这样就不允许在插入时更新数据。例如: ```sql CREATE TABLE table_name ( id INT PRIMARY KEY, ... UNIQUE (unique_column) ON UPDATE NO ACTION ); ``` 请注意,具体禁用策略取决于数据库管理系统和实际业务需求。在某些数据库(如MySQL)中,可以通过配置来全局控制这个行为,而在其他情况下,可能需要在每个触发该行为的存储过程或查询中手动处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值