mysql 有逻辑删除时,怎么设置多字段唯一索引?

mysql数据表设计,多字段联合唯一索引怎么设置。
前提是,表中有个is_del字段。0代表未删除,1代表逻辑删除。
怎么设置code和name字段的联合唯一索引。只针对is_del = 0时生效?

试一试这样


CREATE TABLE table_name (
    id INT PRIMARY KEY,
    code INT,
    name VARCHAR(255),
    is_del INT,
    UNIQUE INDEX idx_code_name (code, name, is_del),
    INDEX idx_is_del (is_del)
);

DELETE t1 FROM table_name t1
INNER JOIN table_name t2 ON t1.code = t2.code AND t1.name = t2.name AND t1.is_del = t2.is_del
WHERE t1.id > t2.id;

创建一个包含is_del = 0条件的虚拟列(computed column)。
基于虚拟列创建联合唯一索引。
给你举个模板:

-- 步骤1:创建虚拟列
ALTER TABLE 表名
ADD COLUMN is_del_0 TINYINT(1) GENERATED ALWAYS AS (CASE WHEN is_del = 0 THEN 1 ELSE NULL END) STORED;

-- 步骤2:创建联合唯一索引
CREATE UNIQUE INDEX idx_code_name_is_del_0 ON 表名 (code, name, is_del_0);


把表名替换为你的实际表名。