一个问题,就难住一群3年+的Java后端[特殊字符]

ZPL语言实战:从基础指令到复杂标签的Java编程实现 本文详细介绍了ZPL语言在斑马打印机上的实战应用,从基础指令到复杂标签的Java编程实现。内容包括ZPL语言基础、标签布局与图形绘制、中英文字符处理、条码生成技巧、图片集成方案以及性能优化与调试技巧,帮助开发者快速掌握斑马打印机的编程实现。 阅读详情

今天面了三个3年+的Java后端,

问了一个这样的问题:

“数据库逻辑删除后,怎么做唯一性约束?”

结果都答得磕磕巴巴,只能让他们回家等通知了,建议多刷多练一下场景题再来面试吧!

如果是你,会怎么回答这个问题呢?

由于篇幅限制,只能给大家展示小部分内容,

全套面试笔记及答案【点击此处】即可免费获取

​

1.22 数据库逻辑删除后,怎么做唯一性约束?

1.22.1 面试考察重点

1. 面试官的考察目标

  • 业务设计能力:对逻辑删除业务场景的理解
  • 数据库技能:对约束机制的深入掌握
  • 解决方案:复杂场景下的问题解决能力
  • 工程思维:实际落地时的综合考量

2. 关键关注点

  • 约束范围:区分已删除和未删除数据
  • 性能影响:方案对数据库性能的影响
  • 查询复杂度:对业务查询的侵入性
  • 数据恢复:逻辑删除恢复时的处理

1.22.2 面试核心知识点详解

不知道大家有没有遇到这么一种业务场景,在业务中有个唯一约束A,当该业务进行逻辑删除后(设置标

记为删除状态),再往唯一约束列插入相同的值时,此时会报Duplicate entry,但在业务上,该值是必

须要插入的。今天我们就来聊聊处理这种业务场景的几种思路

方案一:不采用逻辑删除,直接物理删除

方案二:新建历史表

主表进行物理删除,同时将删除的记录保存到历史表中

方案三:取消表的唯一约束,同时引入redis来保证唯一约束

取消表的唯一约束,在项目中引入redis,通过redis来判重,新增时往redis set记录,删除时,删除

redis记录

方案四:变更删除标记为时间戳

将删除状态不以0,1表示,而是以时间戳为值,然后将删除状态为与之前的唯一约束A重新组成唯一联合

约束index(A、del_flag),删除时变更del_flag的时间戳

方案五:保留删除标记,同时新建一个字段del_unique_key

保留删除状态位,再新增一个字段del_unique_key,该字段默认值为0,字段类型和大小与主键id保持一

致,同时与原先的唯一约束重新组成联合唯一约束index(A,del_unique_key),业务进行逻辑删除,变更

del_unique_key的值为该删除行的主键id

方案的取舍

方案一得从业务的角度上考虑了,如果物理删除,对业务无损,那就无所谓了。方案二等于需要删除的记

录的表都需要有历史表,如果仅仅是用来实现记录删除记录,感觉有点大材小用。方案三引入redis,虽然

也可以解决问题,但是又额外增加复杂度,同时还得保证redis和数据库的一致性。方案四和方案五其实实

现的思路是一样,不过如果已经是在线上跑的业务,还是推荐用第五种方案,毕竟新增字段正常对已有的

业务影响相对较小,如果是第四种方案,直接将标志位修改为时间戳,可能还会涉及改业务。如果是新增

业务,第四种和第五种方案比较推荐

1.223 面试前准备建议和思路

1. 掌握逻辑删除实现方式

  • 标志位设计(is_deleted)
  • 状态字段设计(status=active/deleted)
  • 删除时间戳(deleted_at)

2. 研究唯一约束技术

  • 条件唯一索引
  • 复合索引
  • 触发器维护
  • 应用层校验

3. 准备不同数据库方案

数据库

支持特性

MySQL

函数索引(8.0+)

Oracle

函数索引

SQL Server

过滤索引

PostgreSQL

部分索引

1.22.4 📌面试必过的回答思路

1. 标准回答结构

  • 问题分析:逻辑删除对唯一约束的破坏
  • 解决方案:分级提供多种技术方案
  • 实现细节:具体数据库的实现示例
  • 优劣对比:各方案的权衡选择
  • 最佳实践:生产环境推荐方案

2. 完整回答示例

"针对逻辑删除后的唯一性约束问题,我将提供以下系统化解决方案:

1. 问题本质分析

逻辑删除后,传统唯一索引依然会认为被标记删除的数据存在,导致新插入的"相同"数据违反约束:

-- 原始唯一索引
ALTER TABLE users ADD UNIQUE (username);

-- 逻辑删除后出现问题
UPDATE users SET is_deleted = 1 WHERE id = 1;  -- 删除"admin"
INSERT INTO users (username) VALUES ('admin'); -- 被阻止但业务需要允许

2. 解决方案集

方案一:复合唯一索引(兼容性最好)

-- MySQL/PostgreSQL等通用方案
ALTER TABLE users 
ADD UNIQUE INDEX uk_username_active (username, is_deleted);

-- 特殊处理:已删除记录is_deleted=id
UPDATE users SET is_deleted = id WHERE id = 1;

优点:全数据库兼容

缺点:需特殊处理删除标记

方案二:过滤索引(现代数据库支持)

-- SQL Server/PG/MySQL8.0+
CREATE UNIQUE INDEX uk_username_active 
ON users(username) 
WHERE is_deleted = 0;

优点:直观清晰

缺点:数据库版本要求

方案三:删除标记+默认值组合

-- 使用NULL避开唯一约束
ALTER TABLE users 
ADD UNIQUE INDEX uk_username (username, deleted_at);

-- 删除时
UPDATE users SET deleted_at = NOW() WHERE id = 1;

优点:利用NULL不参与约束特性

缺点:需改造删除逻辑

 

方案四:应用层+数据库双校验

// 事务中先查询后插入
@Transactional
public void createUser(String username) {
    if (userRepo.existsActiveByName(username)) {
        throw new ConflictException("用户名已存在");
    }
    userRepo.save(new User(username));
}

优点:灵活可控

缺点:存在并发漏洞

3. 生产级推荐方案

分阶段实现:

  1. 基础防护:复合索引
ALTER TABLE products 
ADD UNIQUE INDEX uk_product_code (code, is_deleted);
  1. 增强防护:应用层校验
@Service
public class ProductService {
    @Transactional
    public Product createProduct(String code) {
        if (productRepository.existsByCodeAndNotDeleted(code)) {
            throw new BusinessException("产品编码已存在");
        }
        return productRepository.save(new Product(code));
    }
}

…… 

从八进制ASCII到明文:逆向解析4pda.ru注册验证问题 本文详细解析了4pda.ru注册验证中的八进制ASCII编码问题,通过逆向工程展示了从八进制数字序列到明文的解码过程。文章提供了Java实现代码,并探讨了编码识别技巧、底层原理及实际应用中的注意事项,帮助开发者理解并解决类似验证问题。 阅读详情

相关推荐

保姆级教程:用SNAP处理哨兵2号L1C数据,一步步生成L2A大气校正结果

本文提供了一份详细的Windows系统下使用SNAP处理哨兵2号L1C数据的实战指南,涵盖从软件安装、环境配置到L2A大气校正的全流程。特别针对路径报错、版本兼容等常见问题提供解决方案,帮助用户高效完成遥感数据处理,适用于农业监测、环境评估等领域。

weixin_30736301的博客 369

学Java第3周:被“类型不匹配”折磨一周后,我终于把数据类型转换彻底搞懂了![特殊字符]

当小范围数据类型赋值给大范围数据类型时,Java会自动完成类型转换,不需要写任何额外代码,也不会报错,也叫隐式类型转换。当大范围数据类型赋值给小范围数据类型时,Java不会自动转换,必须手动强制转换,否则直接报类型不匹配错误!1. boolean类型绝对不能和其他类型转换2. 小范围转大范围:自动转换,安全无损失3. 大范围转小范围:必须强制转换,可能丢精度/溢出4. 小数转整数:直接砍小数,不四舍五入5. 表达式运算:自动向大范围类型提升6. 转换前先看取值范围,避免溢出报错。

2501_94244498的博客 524

Creo图片导入全指南:从草绘参考到外观贴图的规范化操作

在三维CAD建模中,外部图片资源的管理常被忽视,但导入图片并非简单插入,而是涉及坐标系、比例映射和图层管理等底层逻辑。图片不像矢量图自带精确尺寸,需通过比例校准和草绘平面定位来建立可靠的几何参考,这是提升建模效率和设计还原度的关键。该技术广泛应用于产品外形描线、表面纹理映射、Logo贴花以及工程图模板制作等场景。针对Creo软件,工程师需区分草绘参考、外观贴图和图纸插图三类用途,并掌握由场景驱动的操作路径:先校准比例再描线,通过外观管理器处理贴花透明通道,使用统一模板规范图纸输出。只有将图片视为有坐标、有比

weixin_33755649的博客 441

2018年360测试笔试题为什么仍是2025年复习标配?

测试工程师求职中,扎实的计算机基础、网络协议、数据库和测试理论是笔试考察的核心。大厂客观题往往围绕这些底层知识展开,无论年份如何变化,考点本质保持稳定。理解TCP握手、SQL查询、边界值分析等原理,能够帮助候选人快速定位问题、设计有效用例,在实际工作中应对接口测试、性能分析和缺陷管理。面对海量真题,精读一套覆盖面广、解析全面的老题集,往往是建立知识体系最高效的起点——2018年360春招测试客观题便是这样一份值得反复研读的经典材料。

weixin_33894640的博客 398

Windows平台Android命令行工具包深度解析:从下载配置到实战避坑

Android SDK是进行Android应用开发的软件工具集合,其核心组件包括平台工具、构建工具和系统镜像等。在Windows环境下,Google提供了名为Android命令行工具包(Command-line Tools)的官方工具,它通过sdkmanager、avdmanager等命令行程序,实现了对SDK组件的自动化管理和虚拟设备的创建。这套工具的价值在于为开发者提供了不依赖Android Studio的轻量化、可脚本化的开发环境配置方案,尤其适合持续集成、自动化构建和团队环境统一等工程实践场景。在实

weixin_34210740的博客 444

聚类模型-层次聚类

聚类模型 1、层次聚类 2、原型聚类-K-means 3、模型聚类-GMM 4、EM算法-LDA主题模型 5、密度聚类-DBSCAN 6、图聚类-谱聚类 一、层次聚类 一、聚类理论 ​ 一般来说,聚类是在训练样本的标签信息不知的情况下,学习样本内在的性质和规律,将有限的集合划分成ccc类。根据“方以类聚,物以群分”的思想,类内对象尽可能的相似,...

myazi 6502

遥感数据处理避坑指南:用HEG v2.15把NASA的HDF文件批量转成GeoTIFF

本文详细介绍了使用HEG v2.15工具将NASA的HDF文件批量转换为GeoTIFF格式的完整指南。从Java环境配置、HEG安装路径设置到批处理脚本编写,涵盖了遥感数据处理中的常见问题与解决方案,特别适合环境科学和遥感领域的研究人员快速上手。

weixin_30457465的博客 354

VS2022如何兼容老项目?.NET Framework 4.0/4.5安装避坑指南

本文提供了在Visual Studio 2022中兼容和维护.NET Framework 4.0/4.5等老旧项目的完整解决方案。针对VS2022无法直接识别旧框架的核心问题,文章详细剖析了原因,并重点推荐通过官方NuGet包安全获取引用程序集的方法,给出了从下载、解压到部署至标准目录的详细步骤。同时,文章还深入探讨了项目文件格式过旧、NuGet包还原失败等进阶问题的排查与解决策略,旨在帮助开发者高效、稳定地在现代开发环境中维护历史代码库。

weixin_27734811的博客 513

为什么文件夹名称不能有中文或空格?苍穹外卖 day1 踩坑经历

今天系统学习搭建苍穹外卖 Day1 的全套开发环境,原本以为跟着教程按部就班,就能顺利把环境跑通。文件路径包含中文目录与带空格的文件夹名称。这个问题接连导致 Maven、Nginx、MySQL、Git 四款开发工具出现各类诡异报错,排查过程绕了大量弯路,耗费很久才定位根源。顺带想起之前配置 MySQL 时遇到另一个路径陷阱:路径里\bianchen的反斜杠被程序识别为转义符号,同样引发解析异常,最后依靠修改编码与路径写法才解决。

Song_RsHt的博客 347

uniapp - 实现APP后台持续定位+手机息屏后能持续上传位置信息数据,详解后台保活持续运行+手机锁屏保证后台持续/实时定位的解决方案及示例源码(完美兼容安卓android与苹果ios系统手机)

使用uniapp开发app实现后台保活定位能力,uniapp实时定位保活 息屏定位后台运行,uniapp APP实时定位高德 后台运行 支持锁屏息屏运行,持续获取定位信息,uniapp App端后台间隔时间发送定位功能实现,UniApp实现手机应用常活,固定时间内上传手机位置信息,后台(或锁屏)持续/实时定位的实现方案,uni-app后台持续定位,锁屏后能持续上传位置信息,实现后台定位持续无限制定位高德定位,百度定位,UniApp后台持续定位保如何在APP退到后台时保持定位服务,uniapp 切换app仍能

🏆 前端领域优质创作者 1万+

linux平台Modbus TCP测试

【代码】linux平台Modbus TCP测试。

无线互联&网络介绍 817

商汤科技校招笔试题型全解析:多岗位合并出题与备考指南

技术校招笔试通常围绕计算机基础与算法能力展开,通过数据结构、C++、操作系统等知识点考察候选人的工程素养与逻辑思维。这类笔试的价值不仅在于检验知识储备,更考察在限定时间内解决实际问题的能力。对AI公司而言,算法岗与开发岗都需兼顾理论深度与代码实现,机器学习中的反向传播推导、大数据场景下的TopK问题,都体现出基础原理在工程实践中的泛化应用。本文以商汤科技校招笔试题为样本,完整复盘其多岗位合并出题的考察结构、典型题目与备考策略,帮助求职者系统掌握从选择题到编程题的应试思路。

weixin_34082695的博客 305

maya导入导出bvh 自动 脚本

maya打开bvh脚本

jacke121的专栏 1550

mysql jdbc 更新数据

今天忙了大半天,在更新string类型字段的时候老是提示语法出错,因为mysql的更新语法是 update 表名 set 列名 = '列值' where 语句。这里自己脑袋不开翘啊,就被一个‘’ 难住了,因为列值是一个变量值,用的函数返回值表示的(我写的为String nname = request.getParameter("nname");String name = request.getPa

resolvewang的专栏 1220

数字 IC 笔试面试必考点(2)FPGA 开发流程

FPGA 的详细开发流程就是利用 EDA 开发工具对 FPGA 芯片进行开发的过程,所以 FPGA 芯片开发流程讲的并不是芯片的制造流程,区分于 IC 设计制造流程哟(芯片制造流程多麻烦,要好几十亿的费用呢,而且国内也貌似没有哪家像样的 Foundry 厂,除了台湾的 TSMC 在世界有立足之地,Fabless 的 IC 设计公司倒是挺强的如 Hisilicon,这也是它为什么会被 USA 针对的原因)。

新芯设计的博客 2011

Ceph入门到精通-存储桶通知

这 通知还可以根据前缀的匹配项过滤掉事件,并且 (1) 键的后缀,(2) 附加到对象的元数据属性, 或 (3) 对象标签。在此模式下,操作仅在以下之后确认(确认) 通知将发送到主题的已配置终端节点。这意味着 通知的往返时间(发送 通知主题的终端节点以及接收 确认)被添加到操作本身的延迟中。要更新主题,请使用用于创建主题的相同命令(但在 更新时,使用现有主题的名称和不同的终端节点值)。端口:对于未加密的连接,默认为 5672,对于未加密的连接,默认为 5671 SSL 加密连接。(默认情况下,这是“假的”。

隔壁老瓦的专栏 1131

快递开发api:开发者实现一键查询快递物流神器

开发者无需分别对接多家快递公司,只需调用快递鸟统一标准化API接口,就能实现全平台快递物流的一键查询,真正做到“一次集成,全量覆盖”,将原本数周的开发工作量,压缩至1-2小时,大幅缩短开发周期,降低研发成本。今天,就给各位开发者分享一款“省时省力”的解决方案——快递鸟快递查询API,无需复杂开发,几步就能快速集成,轻松实现一键查询快递物流的“神器”功能,适配各类项目场景,大幅降低研发成本,让开发者聚焦核心业务。shipper_code = "SF" # 顺丰快递编码,其他快递编码可参考快递鸟技术文档。

kdniao2025的博客 642

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1095

秋招开发岗B卷笔试攻略:算法、系统设计与备考策略

校招笔试是技术人才选拔的关键环节,其题目设计通常围绕数据结构与算法、操作系统、计算机网络、数据库等计算机核心知识展开。笔试不仅考察知识点的记忆深度,更考验在有限时间内对复杂问题的拆解与决策能力,比如算法题的边界处理、系统设计题的架构思路。从技术价值来看,掌握笔试规律能帮助候选人快速定位薄弱项,制定高效的复习路线。无论是备战秋招还是日常提升,理解这类评估方式都大有裨益。唯品会秋招开发B类试卷的真题分析,可以拆解客观题、编程题与设计题的常见考点,并给出从算法到系统设计的实战答题策略与复盘方法论,助力读者在有限时

weixin_34235457的博客 383

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 219

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 148

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 114

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 192

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 361

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102
上一篇: 短 URL 生成器设计:百亿短 URL 怎样做到无冲突?
下一篇: 【鹅厂一面真题】数据库乐观锁和悲观锁以及redis分布式锁的区别和使用场景?
Java阿福
博客等级 码龄2年 61粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值