MySql单张表中,“多个唯一字段”的插入和更新操作----添加联合唯一索引,Navicat上操作

本文以用户表tb_device_user为例,介绍在数据库中处理多个唯一约束插入更新的问题。需求是同一token下同一user_id对应唯一密码,设备上传更新时,存在则更新,不存在则插入。使用联合唯一索引解决,通过Navicat演示建表、新建索引,还给出插入和更新的SQL语句。

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

由于是入门的小白,在项目中遇到了类似的问题,做如下记录。

1、问题场景

开始本篇之前,先说下我遇到的问题场景,实际开发的场景为例:

开发中有一张用户表tb_device_user , 用来记录设备上的用户名和密码,由于底层设备的用户ID使用的是自增整数,而且是在各自的设备中保持唯一,通信时候服务器下发token到设备,作为全局唯一的设备识别码,因此至少两个唯一字段。遇到的需求是在数据库中只能保存唯一的用户密码,也就是说同一个token下的同一个user_id对应只能有一个密码,设备会不定期的上传更新用户密码,要求数据库中如果存在就更新,不存在就插入。

以上是一大段的需求场景描述,也是我实际开发中遇到的需求,为简便起见,我用图形来表示

图形表达的话会更形象些。

 

2、解决思路和操作步骤

上面也提到了解决思路,那就是使用 联合唯一索引 来解决插入或更新的问题,我使用的是可视化工具Navicat,就给大家演示下如何操作

2.1)建表

 建表的SQL语句:

DROP TABLE IF EXISTS `tb_device_user`;
CREATE TABLE `tb_device_user` (
  `id` varchar(32) CHARACTER SET utf8 NOT NULL,
  `token` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '设备识别码',
  `user_id` smallint(4) DEFAULT NULL,
  `user_pwd` varchar(10) CHARACTER SET utf8 DEFAULT NULL COMMENT '设备的用户密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2)新建联合索引

3、效果展示

3.1)插入数据操作

附上我的SQL语句 

INSERT INTO `tb_device_user` (
	`id`,
	`token`,
	`user_id`,
	`user_pwd`
)
VALUES
	(
		'002ecf0dfc404906958add9650ebe5cb',
		'94107B5203B14FF389F465E0195AD37B',
		'1',
		'00452132'
	),
	(
		'00f7616d7a4a4ef6bce7a86bf61dcbdd',
		'94107B5203B14FF389F465E0195AD37B',
		'2',
		'1111111'
	),
	(
		'01b24b7ec2f649838689d93a0dd51e9f',
		'94107B5203B14FF389F465E0195AD37B',
		'3',
		'142536'
	),
	(
		'2955ec1b2c384c42997762462257ffdd',
		'AD71F1BD6E9F4721B61986EB13246E53',
		'1',
		'123123123'
	),
	(
		'01bbdd754343457086b044cacbf16c0b',
		'AD71F1BD6E9F4721B61986EB13246E53',
		'3',
		'7894561'
	);

看下表中的数据:

 插入操作刚刚已经做完了,使用的是标准的SQL语句,但是现在需求又不一样了。

3.2)更新表中已有用户密码的操作,如果存在就更新,没有就插入一条新记录

现在的需求如题所描述,更新表中已有的数据,如果该设备下的用户ID下已经有了密码,就更新原来的密码,如果没有,就插入一条新的记录。我就不绕弯子了,直接给出SQL语句来。使用了 ON DUPLICATE KEY UPDATE

下面看下,如果是一条新的记录的插入,也即token和uid中只要有一个不一样的情况下,数据如何插入

 

类似的,如果token相同,但是user_id不一样,那么也会作为一条新数据插入数据表中,如果联合索引一样,也即token和user_id一样的情况下,会执行更新操作。

 

这个就是单张数据表中有多个“唯一约束”的情况下的处理方式,其实可以将多个唯一约束做联合索引来插入或更新数据。

 

参考:MySQL之添加联合唯一索引 - 敲代码的Lee - 优快云博客

### Navicat 16 中 MySQL 索引创建与使用的教程 #### 创建索引Navicat 16中,可以通过图形界面轻松地为MySQL数据库中的创建索引。这不仅提高了查询效率,还简化了数据管理维护工作。 要创建一个新的索引,在目标格上右键单击并选择“设计”。接着转到“索引”选项卡,点击左下角的加号按钮来新增一个索引条目[^2]。在此处可以指定索引名称以及所涉及的一列或多列字段名,并设置唯一性属性等参数。 对于更复杂的场景,也可以直接利用SQL语句完成相同的操作: ```sql CREATE INDEX idx_name ON table_name (column_name); ``` 这条命令会在`table_name`上的`column_name`建立名为`idx_name`的新索引[^1]。 #### 查看现有索引 为了方便用户回顾之前定义过的索引结构,Navicat提供了直观的方式浏览已有的索引信息。只需要展开对应的节点就能看到所有关联的对象,其中包括各个类型的索引项[^3]。 如果希望通过编程手段获取这些元数据,则可通过如下所示的标准SQL查询实现: ```sql SHOW INDEX FROM table_name; ``` 此指令会返回有关给定内各索引的具体详情,如序号、类型及其覆盖范围等重要特性。 #### 删除不再需要的索引 当某些特定条件下原有索引变得冗余或是影响性能时,应当考虑将其移除。同样支持两种途径达成目的——GUI方式DDL脚本形式。 通过导航树找到待处理的目标索引后,简单地选中它再按下Delete键即可快速消除;而采用SQL语法达则更为简洁明了: ```sql DROP INDEX index_name ON table_name; ``` 上述代码片段能够有效地清除掉作用于某张具体之上的某个单独索引实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛声依旧Cjt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值