gorm 软删除deleted_at导致索引失效

博客围绕Golang中Gorm的软删除字段设计展开。指出使用Gorm时间戳设计,唯一索引会因字段允许为空而失效。介绍两种软删除设计方法,一是类似Gorm用时间戳标识,用非空且默认值为0判断未删除;二是使用自定义字段作为软删除字段,默认值为0。

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

如果使用gorm的时间戳设计,由于它的deleted_at字段允许为空,唯一索引加上这个字段后,唯一索引会失效

第一种是像gorm那样,使用时间戳来标识已删除。不同的是,不使用IS NULL来判断未删除的数据,而使用=0来判断未删除的数据。也就是说,deleted_at是非空的,默认值是0。事实上我今天在翻gorm官方文档的时候,发现它其实也是支持这种设计的:

import "gorm.io/plugin/soft_delete"

type User struct {
  ID    uint
  Name  string
  IsDel soft_delete.DeletedAt `gorm:"softDelete:flag"`
}

// 查询
SELECT * FROM users WHERE is_del = 0;

// 删除
UPDATE users SET is_del = 1 WHERE ID = 1;

删除 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.删除一条记录删除一条记录时,删除对象需要指定主键,否则会触发 批量 Delete,例如: // Email 的 ID 是 `10`db.Delete(&email)// DELETE from emails where id = 10;// 带额外条件的删除db.Where("name = ?", "jinzhu").Delete(&emaihttps://gorm.io/zh_CN/docs/delete.html

另一种就是使用自定义字段deleted_id来作为软删除字段。

默认值是0(如果主键是字符串类型,默认为空字符串),如果是已删除的数据,那更新deleted_id=id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值