mysql软删除唯一_软删除唯一索引设置及 Java Zero Date 解决办法-程序员宅基地

技术标签: mysql软删除唯一  

数据是无价的,当我们删除数据时,多数情况下我们会采用设置数据不可见的方法来替代真正意义上的物理删除,这种删除方法就叫做“软删除”。软删除可以保留数据的历史记录,便于今后数据分析以及一些故障情况下的恢复,但软删除也随之带来一些问题:数据表唯一索引失效。

# 唯一索引为什么会失效

很好理解,当我们使用软删除方法时,实际上是将删除delete from table 变为了 update table,虽然对外来说数据变为不可见了,但是数据库中的数据仍然保留,当插入同样的数据情况下,唯一索引就会发生冲突。

# 为逻辑删除字段添加联合索引

解决软删除索引问题的其中一个办法是用业务逻辑来保证数据的合法性,但是那样要大规模的修改插入逻辑,对系统影响较大。

另一个办法就是为我们的唯一字段和逻辑删除字段创建联合索引,这样就要求逻辑删除字段必须是一个动态值,可以是一个token、timestamp或是其他符合自己业务的值。

为什么逻辑删除字段是一个动态值?

考虑以下数据库

执行以下语句

可以看出,当只用一个固定值来代表逻辑删除状态时,联合索引会产生冲突,删除失败

有一个需要注意的坑是,MySQL中的联合索引是不能包含 NULL值的。例如:

在MySQL的官方文档对唯一索引的描述是这样的:

UNIQUE

A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. If you specify a prefix value for a column in a UNIQUE index, the column values must be unique within the prefix length. A UNIQUE index permits multiple NULL values for columns that can contain NULL.

描述的最后写着,唯一索引会允许多个 NULL 值的添加。

因此当我们将逻辑删除字段加入唯一索引时,我们需要为其指定一个0值代表未删除的数据,而不能简单的使用NULL代替。

# Timestamp 0值设置与MySQL严格模式

一般情况下,我们会将逻辑删除字段设置为 timestamp 类型,当发生删除时,直接将字段设置为当前时间,这样既能实现删除字段值的动态变化,也能记录数据删除的时间,便于进行其他数据检索工作。

前面我们提到,逻辑删除字段需要指定一个0值,timestamp也有默认的0值。

timestamp 规定的数据大小是从1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999。其他任何不符合这个时间段的数据都会被变换为0插入到数据库中,这个数据在数据库中的表现为0000-00-00 00:00:00。

MySQL默认是禁止进行以上的转换的,如果直接部署一个MySQL服务并建立默认为0值的timestamp字段,或是插入一个0值的timestamp类型数据都会出错,这种模式被称为 MySQL 严格模式 (strict mode)。

默认的MySQL包含了6种模式(以MySQL 8.0 为准): 名称 意义 ONLY_FULL_GROUP_BY 对于 GROUP BY操作,如果在 SELECT 中的列没有出现在GROUP BY中出现,则拒绝

STRICT_TRANS_TABLE 如果操作中的值不能插入事务表,则拒绝该操作

NO_ZERO_IN_DATE 不允许日期和月份为0

NO_ZERO_DATE 不允许插入0日期

ERROR_FOR_DIVISION_BY_ZERO 如果数据被0除,则报错

NO_ENGINE_SUBTITUTION 如果储存引擎被禁用或未编译,则报错

我们可以通过以下命令查看当前SQL模式:

修改MySQL模式有两种方式: 修改 my.cnf 文件,在[mysqld]下加入:

使用 sql 语句修改 server:

# JAVA LocalDateTime 0值转换

当我们修改完数据库实现0值插入后,还需要对Java做一定的修改。

当我们直接进行数据映射时会发生以下错误

我们需要在mysql连接时添加zeroDateTimeBehavior=convertToNull,告知驱动对0值的处理方法,以 Spring 为例:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35316287/article/details/113418940

智能推荐

Cadence之双击(DSN/brd)文件打开变新建文件的解决方法_如何更改注册表让双击可以启动candence-程序员宅基地

文章浏览阅读4.5k次。注:该文章系转载所得,转载连接:https://www.cnblogs.com/eva0/p/7128068.html。本人亲试方法二、三,均有效,但方法二最为方便快捷,推荐!有时候我们再重新安装Cadence之后,双击打开DNS原理图文件或者brd的PCB文件,发现没有打开对应文件,反而是新建了一个新文件,必须重新取消保存新文件并且从菜单操作打开对应文件,很麻烦我们要解决这个问题,需要修..._如何更改注册表让双击可以启动candence

andriod fragment调用Activity函数方法-程序员宅基地

文章浏览阅读186次。(1)新增一个activity 1 package com.xxxx.activity; 4 5 public interface FragmentCallBack { 7 8 public MainActivity getMainActivity(); 9 10 }(2)在MainActivity 的Java文件中增加g..._android fragment中使用showmsg

[机缘参悟-106] :一个IT人关于爱的理解:智者不入爱河-程序员宅基地

文章浏览阅读321次。然而,正因为情感的短暂性,对于情感的认知和理解需要灵活和细致的观察和分析,不能简单地将情感状态视为恒定的或永久的。然而,需要注意的是,爱情和爱河并非单一的概念,每个人对它们的理解和体验可能有所不同。情感和感情的融合是人类存在的基本特征之一,它们在我们的生活中起着重要的作用。最重要的是,相信自己的直觉和内心的感受。在追求爱情的过程中,保持自我价值和尊严,不断学习和成长,能够帮助我们区分真假爱情,并最终找到真正的幸福。例如,柏拉图的爱的观念认为,真正的爱应该是理性的、追求美善的,并超越个人欲望的。

Linux 下安装pm2后找不到pm2命令解决方法_linux安装pm2后,未找到命令-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏7次。今天安装pm2碰到一个问题,使用npm install pm2 -g安装完成时,找不到pm2命令:在安装提示中可以看到pm2安装位置,此时我们只要使用以下命令将pm2放入系统路径下就可以了:ln -s /home/soft/elk/node-v8.11.3-linux-x64/bin/pm2 /usr/local/bin/..._linux安装pm2后,未找到命令

java 反编译 调试_eclipse 反编译 jar 中 .class 并打断点调试-程序员宅基地

文章浏览阅读643次。eclipse 反编译 jar中.class 并打断点调试1. 下载工具2. 增加jadeclipse功能把 net.sf.jadclipse_3.3.0.jar复制到eclipse/plugins目录下;jad.exe放到 JAVA_HOME/bin下。3.配置jad路径打开eclipse,windows-->perferences-->java--->jadClips..._eclipse 反编译打不了断点

Visual Studio的SDK配置-程序员宅基地

文章浏览阅读2.4k次。Visual Studio的SDKVisual Studio 6.0自带的SDK是1998年的,目录为C:\Program Files\Microsoft Visual Studio\VC98\,这里简记为VS6SDKDIR。以下为打开vc6菜单tools->options->directories. 我们看到Platform为Win32,Show directories ..._vs platformsdk在哪

随便推点

STM32-USB学习系列(五):USB复合设备的实现(MSC + HID)_stm32usb复合设备-程序员宅基地

文章浏览阅读8.9k次,点赞7次,收藏57次。一、整体步骤二、_stm32usb复合设备

Android安全之DM-verity中的Device Mapper机制分析-程序员宅基地

文章浏览阅读9k次,点赞6次,收藏39次。我们想法:能不能将多个硬盘,映射成一个逻辑的硬盘,那样我们程序就不用关心复杂的地址问题了,也不用关系是哪个device了? DM-raid技术RAID全称为独立磁盘冗余阵列(Redundant Array of Independent Disks) 将某个地址段的数据进行加密,只有授权方式才可访问,比如FDE。 DM-crypt技术访问存储介质上的数据时,校验下是否被篡改过

apache=>DokuWiki 安装-程序员宅基地

文章浏览阅读306次。checking for APR... noconfigure: error: APR not found.解决办法:1.下载所需软件包:[code="java"]wget http://archive.apache.org/dist/apr/apr-1.4.5.tar.gz wget http://archive.apache...

crio电压采集 labview_LabVIEW与cRIO入门.pdf-程序员宅基地

文章浏览阅读702次。 和 CompactRIO LabVIEW入门指南注 新用户可通过LabVIEW 入门指南了解LabVIEW 基本信息和相关术语。本..._labview crio

13. 试用vSphere 6(二):使用vSphere Client 6.0管理ESXi主机-程序员宅基地

文章浏览阅读2.3k次。一、VMware vSphere 6(RC版)安装配置系列文章:1、试用vSphere 6(一):安装ESXi 6 RC版2、试用vSphere 6(二):使用vSphere Client 6.0管理ESXi主机3、试用vSphere 6(三):安装vCenter 6(独立数据库)之:域控服务器安装与配置4、试用vSphere 6(三):安装vCenter 6(独立数据_vsphere client 6

使用gb2312乱码,utf-8正常-程序员宅基地

文章浏览阅读4.9k次。问题:使用gb2312编码会导致在终端输出和网页输出都是乱码,使用utf-8则不会。原因:jsp使用的编码方式是gb2312,这个编码方式决定了jsp页面所有显示文字的编码方式,包括text组件中输入的内容。对于get方法,请求参数是直接拼接在url后面的,而这个参数的编码应该也是由jsp使用的编码方式决定的。这些参数到达tomcat后,会首先经过一次解码,这个过程是程序不能干预的,发生在servlet所有的操作进行之前。而tomcat8之后默认的编码方式是utf-8,两个编码方式的不一致就导致了乱码。._gb2312乱码

推荐文章

热门文章

相关标签