做MySQL数据表设计的时候有时候会遇到需要建立按条件唯一索引的情况,举个例子:
销售表sale是记录goods 的销售记录的,sale表 有goods_id和status 2个字段,status=1正常 =2表示作废,每个goods_id对应 status=1的记录只能有一条,对应status=2的记录可以有多条,为了防止重复写入销售正常的销售记录数据,就要建立一个唯一索引,如果是mysql8.0或以上版本那好说,直接用一下语句实现:
CREATE UNIQUE INDEX idx_goods_status ON sale(goods_id) WHERE status = 1;
那如果是mysql5.7呢,就得利用虚拟字段来做了,具体如下
第一步:先新建一个虚拟字段status_flag
ALTERTABLEsaleADDCOLUMNstatus_flagVARCHAR(100)GENERATEDALWAYSAS(IF(status=1,goods_id,NULL))STORED;
第二步:给字段status_flag建立索引
CREATE UNIQUE INDEX idx_goods_status ON tbl_sale(status_flag);
这就完美解决了约束问题了。