mysql的replace方法

一、replace函数

语法:replace(object,search,replace) 
语义:把object对象中出现的的search全部替换成replace。 
实例:

update hellotable set 'helloCol' = replace('helloCol','helloSearch','helloReplace')

二、replace into函数

为什么会接触到replace into函数,是因为业务需要向数据库中插入数据,前提是重复的不能再次插入。以前用where解决的,今天才知道还有一个更简洁的方法replace。 
replace具备替换拥有唯一索引或者主键索引重复数据的能力,也就是如果使用replace into插入的数据的唯一索引或者主键索引与之前的数据有重复的情况,将会删除原先的数据,然后再进行添加。 
语法:replace into table( col1, col2, col3 ) values ( val1, val2, val3 ) 
语义:向table表中col1, col2, col3列replace数据val1,val2,val3

实例:

REPLACE INTO users (id,name,age) VALUES(123, ‘chao’, 50);

三、唯一的组合索引

因为在创建索引的时候发现很多问题,放在这儿做一下记录。

首先我们使用replace的原因就是因为它有“防重”的作用,但是它的“防重”作用仅仅是局限在唯一索引上或者主键索引上。所以我们使用replace时必须要有一个唯一索引。

而业务的逻辑需要四个字段唯一确定一条记录,也就是说我要建立一个组合索引也即多列索引。

最终确定需求就是我要create出一个unique的组合索引,很简单是不是,后面讲坑。。。

先讲讲组合(多列)索引是什么鬼?! 
组合索引的生效原则是 从前向后依次生效,如果中间某个索引没有使用, 那么断点前面的索引部分起作用,断点后面的索引没有起作用,即最左优先原则

例如创建多列索引(a,b,c)

where a=3 and b=45 and c=5...
这种三个索引顺序使用中间没有断点,全部发挥作用;

where a=3 and c=5... 
这种情况下b就是断点,a发挥了效果,c没有效果;

where b=3 and c=4... 
这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;

where b=45 and a=3 and c=5...
这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关;

如何创建组合索引 
语法:CREATE UNIQUE INDEX index ON table( col1, col2, col3 ) 
实例:CREATE UNIQUE INDEX index_unique ON app(pkgName,version,device,osver)

第一个问题:创建的索引长度是有限制的,不能超过767,发现字段的长度也用不了varchar(256)于是改成了varchar(100)。 
第二个问题,“error: Duplicate etry”,“重复实例”,因为在创建这个唯一索引的时候表中已经有很多重复数据了,所以很肯定创建不成功

MySQL 中的 `REPLACE` 语句是一种用于插入或更新数据的命令。它的工作原理类似于 `INSERT`,但如果表中已经存在具有相同主键或唯一索引值的记录,则会先删除该旧记录再插入新记录。 以下是关于 `REPLACE` 的详细介绍: 1. **基本语法**: ```sql REPLACE INTO table_name (column_list) VALUES(value_list); ``` 其中 `table_name` 表示目标表名;`column_list` 和 `value_list` 分别列出需要操作的列及其对应的值。 2. **工作流程**: - 如果指定行不存在(即没有冲突),则直接执行插入操作。 - 若发现有重复的关键字(如 PRIMARY KEY 或 UNIQUE 约束),那么就首先删除原始记录然后再添加新的记录进去。 3. **注意事项**: - 使用前需明确是否真的适合使用此功能,因为它可能会导致一些意外的数据丢失情况发生。 - 每次成功完成一次替换都会增加两个计数到信息数据库里的“受影响行”数目上——一个是因删除产生的影响,另一个则是由于新增加而来的效果。 4. 示例案例: 假设有一个名为 users 的用户信息表格包含 id、name 字段,并设置了id为主键。下面演示如何利用replace语句往里边存入一条数据以及当遇到同样ID时候的行为模式: 第一步: 创建测试表并初始化几条样本数据; ```sql CREATE TABLE IF NOT EXISTS users( id INT AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY(id) ); INSERT INTO users(name) VALUE ('Alice'),('Bob'); ``` 第二步: 尝试对现有用户Alic做修改尝试; ```sql -- 此处将 Alice 改成 Charlie 同时保留其原有的 ID 编号不变 REPLACE INTO users(id,name)VALUES(1,'Charlie'); SELECT * FROM users; -- 输出结果应显示 [1,'Charlie'],[2,'Bob'] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值