mysql设主键时碰到这个了。主键中字段数不能超过16.
#1070 - Too many key parts specified; max 16 parts allowed但我那张表比较怪,大家看看该怎么解决,以下是结构:create table `data`
(account_email char(50) not null,
profileId int(15) not null,date date,year int(4),month int(2),week int(2),day int(2),hour int(2),country varchar(30),region varchar(30),city varchar(30),browser varchar(20),language char(8),countOfVisits int(20),daysSinceLastVisit varchar(20),pageDepth int(4),visitorType char(20),adContent varchar(100),adGroup varchar(30),adSlot varchar(20),adSlotPosition char(10),campaign varchar(20),keyword varchar(20),medium char(10),referralPath varchar(50),source varchar(20),exitPagePath varchar(50),landingPagePath varchar(50),daysToTransaction char(10),productCategory varchar(30),productName varchar(30),productSku varchar(30),bounces int(20),entrances int(20),exits int(20),newVisits int(20),pageviews int(20),timeOnPage float,timeOnSite float,visitors int(20),visits int(20),adClicks int(20),adCost float,CPC float,CPM float,CTR float,impressions int(20),uniquePageviews int(20),itemRevenue float,itemQuantity int(20),transactionRevenue float,transactions int(20),transactionShipping float,transactionTax float,uniquePurchases int(20));这是关于google analytics的数据的一张表格,
中间我空了一行,是为了便与解释。
下半部分的字段的值由上半部分那些字段确定。这表目前没设pk,能不设pk吗?
但这样以后如果要加表就可能比较麻烦了。
如果我加个字段row_id,作为主键,设成了auto_incresement,那如果执行2次
insert into table data
(date,browser)
values ('2008-01-01','IE');
同样的数据在数据库中就会重复出现,这是个很严重的问题。
另外这样一个主键也压根没什么实际用处。
创建的这张表可能也有问题,数据冗余很大,因为google analytics的限制,表中上半部分的那些字段每行最多只能有7个有值(第一第二个not null的不算在内),其它全为空。
但我又想不出什么别的办法建表格,如果要做排列组合的话,大概是24取7做组合吧,表的数量太多了,最后执行查询什么的可能会比较麻烦,也不方便直接查看。我数据库方面接触实在太少了,希望各位解释的时候能稍微通俗一点,不甚感激

解决方案 »

  1.   

    你怎么想的这么多 这么复杂。。
    你到底想建个什么表直接建不就完了,想设PK 直接再加个字段row_id然后auto_****不就OK了
      

  2.   

    MYISAM 每张表索引(键)字段的数量不得大于16个
    索引(键)设置不合理(过多,过复杂)会影响写入性能,你弄成这样影响就很严重了
    year int(4),month int(2),week int(2),day int(2),hour int(2) 这些为什么不能合并到一个字段?我认为你可以把需要的字段的值通过散列函数(如:md5)计算出一个值,然后用这个值作为主键约束
      

  3.   

    没办法,google analytics里提供的数据比较多,那些字段很难再减少了。2楼说的那些字段,也不能减,因为可能会出现没有date为null的时候,总之比较麻烦。
    2楼说的通过散列函数算个值出来,可能是个办法。
    没有主键约束的话,插入时比较麻烦,可能会出现数据重复的情况。再看看有没啥好办法吧。谢谢各位了