在将分组聚合结果(就是用了group by col,col2…)保存到mysql时,列是一个联合唯一索引,多个列的组合不重复,发现下面这两个语句会报错:
1Duplicate entry '2019-01-04-tx' for key 'PRIMARY'
很显然,这是主键或者唯一索引冲突导致的。
因为我执行了这样两条sql:
insert into tableName(date,workflow,cou) values('2019-01-04','tx',10000);
insert into tableName(date,workflow,cou) values('2019-01-04','Tx',100000);
mysql会将这date,workflow两列的值组合,作为索引,索引的初衷当然是为了提高高并发查询效率,但是在这里
2019-01-04-tx
2019-01-04-Tx
被当作一样的联合值了,所以报错,索引冲突。
解决方法是:
修改列指定binary
将workflow修改为区分大小写,这里是workflow取值tx,Tx造成的冲突。显然,要用到alter语法:
alter table statistic_daily_workflow_count modify column workflow varchar(170) binary character set utf8 collate utf8_bin;
这样就能愉快的玩耍了。
所以,需要注意的是
问题一:MySql默认主键不区分大小写
实例:
-- 创建混合类型
create table PlainText(
Content nvarchar(50) ,
primary key(Content)
);
insert into PlainText values('a');
insert into PlainText values('A');
抛出异常:Duplicate entry ‘a’ for key ‘PRIMARY’,主键不能重复
解决方法1:创建表时字段指定binary
create table PlainText(
Content nvarchar(50) binary,
primary key(Content)
);
解决方法2:修改列指定binary
-- 修改列
ALTER TABLE `Md5Data`.`PlainText`
CHANGE COLUMN `Content` `Content` VARCHAR(55) CHARACTER SET 'utf8' BINARY NOT NULL DEFAULT '' ;
问题二:MySql查询时不区分大小写
第一种:让mysql查询时区分大小写
select * from usertable where binary id = 'A';
第二种:在建表时加以标识
create table table_name {
id varchar(32) binary;
}