Skip to main content

删除

删除记录

删除记录时,需要指定主键,否则会触发 批量删除 (Batch Delete)。

// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;

// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";

根据主键删除

db.Delete(&User{}, 10)
// DELETE FROM users WHERE id = 10;

db.Delete(&User{}, "10")
// DELETE FROM users WHERE id = 10;

db.Delete(&users, []int{1,2,3})
// DELETE FROM users WHERE id IN (1,2,3);

批量删除

如果指定的值没有主键,GORM 会执行批量删除。

db.Where("email LIKE ?", "%jinzhu%").Delete(&Email{})
// DELETE from emails where email LIKE "%jinzhu%";

db.Delete(&Email{}, "email LIKE ?", "%jinzhu%")
// DELETE from emails where email LIKE "%jinzhu%";

软删除 (Soft Delete)

如果你的模型包含 gorm.DeletedAt 字段(也包含在 gorm.Model 中),它将自动获得软删除的能力!

当调用 Delete 时,记录不会从数据库中永久删除。相反,GORM 会将 DeletedAt 的值设置为当前时间,并且以后普通的查询方法将找不到该记录。

// 批量删除
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2020-10-23 11:14:00" WHERE age = 20;

// 查询时会忽略被软删除的记录
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;

查找被软删除的记录

可以使用 Unscoped 查找被软删除的记录。

db.Unscoped().Where("age = 20").Find(&users)
// SELECT * FROM users WHERE age = 20;

永久删除

可以使用 Unscoped 永久删除匹配的记录。

db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id = 10;