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

  • 相关阅读:
    傻逼Eclipse笔记
    Less笔记
    [转]解决WebClient或HttpWebRequest首次连接缓慢问题
    Css3图标库
    Json.Net4.5 序列化问题
    async和await
    CLR、内存分配和垃圾回收
    C#7.0新语法
    C#6.0新语法
    C#泛型详解
  • 原文地址:https://www.cnblogs.com/qiaoer1993/p/15910741.html
Copyright © 2020-2023  润新知