在项目中经常碰到需要对表设置唯一索引,未逻辑删除的数据不允许重复,这种情况我们该如何正确的创建唯一索引?
如下表,需要给username字段添加唯一索引,已删除的数据可重复,该怎么设置唯一索引呢?
在MySQL中,比较两个NULL
值时,你会得到一个NULL
结果。这是因为NULL
代表的是“未知”或“无值”的状态,而不是一个具体的值。因此,当你尝试比较两个NULL
值时,你不能得到一个明确的“相等”或“不相等”的结论,因为它们都代表未知。
唯一索引对null不起作用,字段为null的可以重复,利用这一点完美解决唯一索引和逻辑删除的冲突
我们可以新增一个username的虚拟字段,对虚拟字段创建索引
CREATE TABLE `ums_admin` (`id` bigint NOT NULL AUTO_INCREMENT,`username` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`password` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`icon` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '头像',`email` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '邮箱',`mobile` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '手机',`nick_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '昵称',`note` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注',`create_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建时间',`login_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '登录时间',`status` int DEFAULT '0' COMMENT '帐号启用状态:0->未删除;1->已删除',PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=1633854642188767235 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='后台用户表';
第一步:新增一个虚拟字段,状态未删除是直接将username值填入,删除时设置为null
ALTER TABLE ums_admin
ADD COLUMN unique_username VARCHAR(255) AS (CASE WHEN status = 1 THEN username ELSE NULL END
) VIRTUAL;
第二步:给虚拟字段创建唯一索引
ALTER TABLE ums_admin
ADD UNIQUE INDEX idx_unique_username (unique_username);