• 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='屏蔽券信息';

  • 相关阅读:
    高斯消元算法
    Fermat小定理的证明
    Pollard Rho 算法简介
    做一些无聊的题
    永远不要相信自己的傲慢
    笔记-数据结构进阶
    笔记-区间问题
    线段树板子
    [DarkBZOJ3694] 最短路
    [CF321D] Ciel and Flipboard
  • 原文地址:https://www.cnblogs.com/qiaoer1993/p/15910741.html
Copyright © 2020-2023  润新知