多數情況下嗤军,如果一張表字段A
被設置成唯一索引
后残黑,重復數據不允許添加馍佑。這個時候如果有邏輯刪除操作,可以將字段A與deleted
字段建成聯(lián)合唯一索引
梨水。似乎這樣就可以了拭荤,然而事情并沒有那么簡單。
這里deleted
字段使用0疫诽,1標識未刪除與已刪除舅世。
創(chuàng)建表。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) NOT NULL,
`deleted` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_user` (`user_name`,`deleted`)
)
這里我們有一條數據奇徒,id=1, user_name=張三, deleted=0
雏亚。
我們先進行刪除操作,將deleted
字段更新為1摩钙。
update user set deleted = 1 where id = 1;
然后我們在插入一條數據罢低,user_name=張三
。
insert user(user_name) values ("張三");
此時插入數據的id=2
胖笛。
然而當我再次進行刪除操作時:
update user set deleted = 1 where id = 2;
會發(fā)現(xiàn)無法成功進行此操作网持。因為user_name=張三,deleted=1
的數據已經存在了。
這個時候我們該怎么辦呢长踊!以前我也不知道怎么辦功舀,后來發(fā)現(xiàn)一種十分機智的辦法。
那就是不用0和1標識deleted字段身弊,使用0和一段時間戳標識刪除字段
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) NOT NULL,
`deleted_at` int(11) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_user` (`username`,`deleted_at`)
)
那么我們在進行邏輯刪除的時候日杈,只需要這樣做:
update user set deleted = UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3))*1000 where id = 2;
這樣就可以處理好邏輯刪除和聯(lián)合唯一索引多次刪除的問題了。