mysql或mariadb带条件复合索引的办法

l2qq · 2022-04-01 16:21
字数 1634 评论 0 收藏 0 点赞 0

想实现:

保证状态:启用,id相同的唯一?
就是不能出现:
id:1  状态:启用
id:1  状态:启用
id:1  状态:   作废
id:1  状态:   作废

但是可以:
id:1  状态:启用
id:1  状态:   作废
id:1  状态:   作废
id:1  状态:   作废
id:1  状态:   作废

通过虚拟列,用if来生成check,如果状态1,就读取id,否则就换一个逻辑,这里是通用日期,然后再把check进去unique唯一

CREATE TABLE `test` (
  `id` int NOT NULL,
  `status` int DEFAULT NULL,
  `check` varchar(50) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (if((`status` = 1),`id`,concat(`id`,_utf8mb4'_',`time`))) VIRTUAL,
  `time` datetime DEFAULT NULL,
  UNIQUE KEY `uni_check` (`check`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER table cash drop column `check` -- 删除字段

-- add 增加
-- modify 修改字段类型

ALTER table cash ADD column `check` varchar(250) COLLATE utf8mb4_unicode_ci GENERATED ALWAYS AS (if(`isCancel` = 0,concat(`year`,_utf8mb4'_',`month`,_utf8mb4'_',`cashTypeId`),concat(`year`,_utf8mb4'_',`month`,_utf8mb4'_',`cashTypeId`,_utf8mb4'_',`createDate`,_utf8mb4'_',IFNULL(`lastDateCash`,'0')))) VIRTUAL AFTER `month`


最新评论 0