軟刪除與唯一索引衝突的解決方案
阿新 • • 發佈:2019-01-22
我們現在刪除資料庫表資料的時候大都會用軟刪除,或者用某個欄位標記為無效,但如果該表某個欄位需要有一個唯一索引,但是無效或軟刪除的記錄不應該在唯一索引範圍內。
說了一大堆,舉個例子,比如有一張user表
CREATE TABLE USER_TEST (
id BIGINT NOT NULL AUTO_INCREMENT,
user_name VARCHAR (50) NOT NULL COMMENT '使用者名稱',
pwd VARCHAR (50) NOT NULL DEFAULT '' COMMENT '密碼',
id_card VARCHAR (18) NULL DEFAULT '' COMMENT '身份證',
is_delete TINYINT NOT NULL COMMENT '是否已刪除:1,是 0否',
PRIMARY KEY (id),
UNIQUE KEY un_id_card (id_card)
)
身份證要求全表唯一,但是如果某個使用者被刪掉了(即is_delete=1),那麼這個人的身份證需要可以被別人使用,但就目前表結構是不可以的,因為再插入的時候會與被刪除的使用者身份證唯一索引衝突。
那怎麼辦呢,把UNIQUE KEY un_id_card (id_card)改成聯合索引唯一約束UNIQUE KEY un_id_card (id_card,is_delete)可以嗎?好像可以解決問題,但是第二個使用者再刪除後,第三個使用者用這個身份證又有同樣的問題了。
其實再改造一步就可以了。
我們把is_delete設為全域性增長的一個id,或者刪除時的時間戳,或者一個uuid,這樣再加上UNIQUE KEY un_id_card (id_card,is_delete)這個聯合唯一約束就可以了。當然前提是需要改一下is_delete欄位的型別,未刪除的都是0,其他的非0,這樣唯一索引不就可以達到只是未刪除的效果了嗎?