gorm踩坑 軟刪除與某個欄位的唯一性

2021-08-28 03:32:00 字數 985 閱讀 9269

有乙個user_infos表,使用者名稱唯一。我在model定義user_name的時候已經使用gorm的tag標記為unique_index。類似如下:

type userinfo struct
需求如下:

這個使用者允許刪除,但是又不能真正從db刪掉。

gorm的model如果有deleted_at欄位,會預設執行軟刪除。所謂的軟刪除也就是把deleted_at置為當前時間,該記錄並不會從db刪除。

where deleted_at is null
也就是說,gorm查詢的時候是不會去查詢那些已經被軟刪除的記錄的,哪怕你在你的查詢語句裡面手動加上

where deleted_at is not null
也是無法查詢到的,我試過了,你也可以試試。這也就是軟刪除的作用,查詢是查不到的。

那麼問題就來了,我的user_infos表要求使用者名稱唯一。每次create記錄的時候,如果之前已經存在一條已經被軟刪除的記錄,並且被軟刪除的記錄的user_name與當前新增的記錄的user_name相同,那麼會無法新增成功。

報錯類似如下(因為昨天在公司遇到的,今天週末在家整理,無法上圖,等周一可以再來上圖)。

duplicate key for ...
其實問題就出在軟刪除的記錄那裡。

解決:為了保證以後這條被軟刪除的記錄還能找到(硬刪除就真的再也找不到了),於是就在執行軟刪的時候不呼叫delete方法,而是呼叫update方法,設定deleted_at為當前時間,並且把需要保持唯一性的字段,比如我這裡的使用者名稱,在原來的使用者名稱後面加了個時間標記。

如以前的使用者名稱是張三,現在我刪除的時間是2018-09-15 11:13:06 ,那麼我最終將需要刪掉的這條記錄的使用者名稱設定為張三2018-09-15 11:13:06。

當然這只是個標記而已,你也可以新增你自己的標記,反正最終目的就是為了保證以後這條記錄能被找到。

mysql 替換某個欄位中的某個字元

遇到這麼個情況 比如 msql裡面的某個表的某個字段裡面儲存的是乙個人的位址,有一天這個位址的裡面的某個地 名變了,那麼他的位址也就要變 比如 原來是 csharp view plain copy number addr 01 四川省成都市 街道05號 02 四川省成都市 街道07號 03 四川省成...

mysql替換某個欄位中的某個字元

比如 msql裡面的某個表的某個字段裡面儲存的是乙個人的位址,有一天這個位址的裡面的某個地 名變了,那麼他的位址也就要變 比如 原來是 number addr 01 中國浙江 02 中國浙江 03 中國浙江 現在位址改了 浙江 搬到了 上海 所以,addr欄位裡面的所有的值,都要把 浙江 改為 上海...

MYSQL刪除某個字段多餘重覆記錄

sells表資訊 create table sells id int 11 not null auto increment,唯一id name varchar 50 not null,姓名 phone varchar 10 not null,project varchar 50 not null,專...