记一次联合的唯一索引的使用

一问题描述

最近项目中有这样一个场景,需要将每个农贸市场的商户以统计好的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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值