一问题描述
最近项目中有这样一个场景,需要将每个农贸市场的商户以统计好的excel录入导入到mysql表中,但是excel表来自不同的人,统计时并不是很规范可能存在两个excel中有相同的数据。但是要求是同一个农贸市场不能有两个相同的商户
表结构如下
stall_id | market_id | stall_name | stall_person | stall_phone | create_time | register_time | … |
商铺id | 农贸市场id | 商铺名称 | 注册人 | 注册人电话 | 创建时间 | 注册时间 |
|
二.解决方案分析
1.通过代码中加入逻辑判断
在代码批量插入前,遍历集合判断是否有同一商铺名称并且所属农贸市场相同的元素,存在则剔除(或者重新javabean的equals方法equals中只对商铺名称和农贸市场进行equals重写,再用set去重),这些方法当然是完全可行的。只是比较麻烦
2.通过添加联合的唯一索引的方法
对stall_name,和market_id这两个字段添加联合的unique索引(即表示同一个市场不能有两个相同名称的摊位存在),并配合mysql的ignore关键字来解决上面的问题
列如:
alter table t_stall add unique index UX_STALL_MARKET(stall_name,market_id);
还有一种情况就是,我们需要为以前的表 创建这个索引,有可能以前的数据中存在重复的记录 那怎么办呢?
alter ignore table t_aa add unique index xx (aa,bb);
它会删除重复的记录(会保留一条),然后建立唯一索引。
注意:我的mysql版本是5.7。网上有说mysql8 使用alter ignore table t_aa add unique index(aa,bb); 这种语法报错的,没具体试过。
三.延伸拓展
1.索引创建的相关拓展
查看索引 :
show index from 数据库表名
PRIMARY KEY(主键索引):
ALTER TABLE `table_name` ADD PRIMARY KEY [index_name] ( `column` )
UNIQUE(唯一索引);
ALTER TABLE table_name ADD UNIQUE INDEX [index_name] (column)
create unique INDEX [index_name] on table_name (column) ;
普通索引
ALTER TABLE `table_name` ADD INDEX [index_name] ( `column` )
create INDEX [index_name] on table_name (column) ;
FULLTEXT(全文索引):
ALTER TABLE `table_name` ADD FULLTEXT [index_name] ( `column` )
create FULLTEXT INDEX [index_name] on table_name (column) ;
多列联合索引:
ALTER TABLE `table_name` ADD INDEX [index_name] ( `column1`, `column2`, `column3` )
create INDEX [index_name] on table_name (`column1`, `column2`) ;
多列联合唯一索引:
ALTER TABLE `table_name` ADD UNIQUE INDEX [index_name] ( `column1`, `column2`)
create UNIQUE INDEX [index_name] on table_name (`column1`, `column2`) ;
注意:索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以同时创建多个索引。
2.联合索引相关拓展
三.联合索引详解
https://www.cnblogs.com/wyqn/p/10094854.html