mysql唯一键需要注意的坑~

需求:需要用mallId、keyword、batchId三个字段来组成唯一键,防止三个参数完全相同的数据插入数据库;但是有一种情况,keyword和batchId字段不会同时存在,总有一个字段为空。

错误建表语句如下:

coupon_batchid_keyword | CREATE TABLE `coupon_batchid_keyword` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`mallId` varchar(10) DEFAULT NULL COMMENT 'mallId',
`keyword` varchar(100) DEFAULT NULL COMMENT '屏蔽的关键词',
`batchId` varchar(40) DEFAULT NULL COMMENT 'batchId',
`insertTime` varchar(40) DEFAULT NULL COMMENT '插入时间',
`isDelete` varchar(4) DEFAULT '0' COMMENT '是否删除',
`updateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `unique1` (`mallId`,`keyword`,`batchId`)
) ENGINE=InnoDB AUTO_INCREMENT=344 DEFAULT CHARSET=utf8 COMMENT='屏蔽券信息';

经测试,效果达不到目的,原因如下:

这种情况下必须保持三个字段都存在,不能有任何一个字段空着,如果batchId这个字段为空,那么就会存在相同的mallId、keyword数据存在,导致重复数据的产生。

 

正确建表语句如下:

coupon_batchid_keyword | CREATE TABLE `coupon_batchid_keyword` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`mallId` varchar(10) DEFAULT NULL COMMENT 'mallId',
`keyword` varchar(100) DEFAULT NULL COMMENT '屏蔽的关键词',
`batchId` varchar(40) DEFAULT NULL COMMENT 'batchId',
`insertTime` varchar(40) DEFAULT NULL COMMENT '插入时间',
`isDelete` varchar(4) DEFAULT '0' COMMENT '是否删除',
`updateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `unique1` (`mallId`,`keyword`),
UNIQUE KEY `unique2` (`mallId`,`batchId`)
) ENGINE=InnoDB AUTO_INCREMENT=344 DEFAULT CHARSET=utf8 COMMENT='屏蔽券信息';

posted @ 2022-02-18 17:48  乔儿  阅读(182)  评论(0编辑  收藏  举报