当前位置: 首页 > news >正文

MySQL 条件唯一索引实战:用 delete_time 实现活跃记录唯一

在开发中,我们经常遇到这种需求:

“希望表里的某些组合在活跃状态下唯一,但已删除或软删除记录可以重复。”

比如我们有一个 客服提奖设置表,字段包括 admin_idgoods_typegoods_iddis_commissiondelete_time

我们希望:

  • 活跃记录delete_time IS NULL)必须唯一

  • 已删除记录delete_time 不为 NULL)可以重复


一、传统做法的问题

  1. 在应用层判断

    • 写查询判断是否存在

    • 弊端:代码复杂、容易出错,性能差

  2. 触发器

    • BEFORE INSERT / UPDATE 检查

    • 弊端:写法复杂,性能消耗大

MySQL 8.x 提供了更优雅的方案:生成列(Generated Column)+ 唯一索引


二、实现思路

1. 生成列(Generated Column)

利用 delete_time 创建一个辅助列 admin_goods_unique_active

ALTER TABLE dyy_shopro_customer_setting ADD COLUMN admin_goods_unique_active INT GENERATED ALWAYS AS ( CASE WHEN delete_time IS NULL THEN 1 ELSE NULL END ) VIRTUAL;
  • 活跃记录 → 1

  • 已删除记录 → NULL

  • 虚拟列:不占用存储空间,动态计算

2. 唯一索引

在原来的组合字段基础上加上生成列:

CREATE UNIQUE INDEX unique_admin_goods_commission_active ON dyy_shopro_customer_setting ( admin_id, goods_type, goods_id, dis_commission, admin_goods_unique_active );

效果

  • 只检查活跃记录的唯一性

  • 已删除记录不会触发唯一约束(MySQL 允许唯一索引包含多个 NULL)


三、通俗理解

把生成列想象成 一个开关

delete_timeadmin_goods_unique_active是否检查唯一性
NULL1
非 NULLNULL
  • 开关开着(1) → 唯一索引生效,不能重复

  • 开关关着(NULL) → 唯一索引忽略,允许重复


五、应用层异常处理

在 在业务层面可以判断数据是否重复 给出友好提示

  • 1062 是 MySQL 唯一索引冲突错误码

  • 可以直接返回给前端提示信息


六、总结

  1. 活跃记录唯一,删除记录允许重复

  2. 生成列自动计算,无需手动维护

  3. 性能好、安全可靠,不依赖应用层判断或触发器

  4. 通用性强,可以用于各种“条件唯一”场景


七、可视化理解(流程图)

delete_time │ ▼ 生成列 admin_goods_unique_active │ ├─> 1 (活跃) ─> 唯一索引检查唯一性 │ └─> NULL (已删除) ─> 唯一索引忽略

  • 插入或更新时,生成列会自动计算

  • 唯一索引只对生成列为 1 的记录生效


💡 一句话总结

delete_time + 生成列 + 唯一索引,你可以优雅实现“活跃记录唯一、删除记录可重复”的条件唯一索引,数据库自动保证安全性和唯一性。

http://www.dtcms.com/a/611064.html

相关文章:

  • ⭐ TIE Cell(Tie-High / Tie-Low)完整技术总结与工程指导
  • 淘宝网站c 设计怎么做wordpress屏蔽右键
  • 苏州网站制作公司合肥建设网
  • 简化接口测试:利用Dify工作流结合CI/CD,实现一键式回归验证
  • 网站建设宣传方案三更app下载网站
  • 济宁祥云网站建设深圳龙华是低风险区吗
  • 如何利用个人nas做网站广州市建设局官方网站
  • Linux内核LED驱动开发:实现可控制闪烁与常亮的GPIO驱动
  • 信息论(四):熵与概率分布的期望
  • 辽宁网站网站建设刚刚中国突然宣布
  • Mysql主从复制 windows下
  • 白云区网站建设公成都建设高端网站
  • UART、IIC、SPI、CAN通信协议简介
  • 鸿蒙系统编译语言 | 深入探讨鸿蒙编译技术及其应用前景
  • 网站建设一对一培训网站建设ssc源码最新
  • C语言编译速度 | 提升编译效率的方法与技巧
  • 【Python爬虫基础-3】数据解析
  • 做网站能用思源黑体吗wordpress文章页面模板
  • 精品源码分享的网站首尔面积
  • 科普:LLM中的网页工具:Fetch与GeneralSearch
  • 第2章 Hello World
  • js语法js语法js语法
  • 如何在三维空间中生成任意方向的矩形内部点位坐标
  • 微信如何做网站西安网站制作托
  • 石家庄网站服务万维网的网站
  • leetcode 387. 字符串中的第一个唯一字符 python
  • 基于深度学习的磁共振图像膝关节损伤多标签识别系统研究
  • 网站制作工作室24小时接单微信小游戏源码
  • 做网站会出现什么问题wordpress如何更改上传文件大小
  • vue3 组合式 API 详解