看yueliangdao0608的文章里面提到的东西,传送门:
http://blog.chinaunix.net/space.php?uid=259788&do=blog&id=2139293
create table category_part( 
cid int unsigned not null auto_increment,
cname varchar(64) not null,
parent_id int not null,
primary key (cid,parent_id))
partition by list(parent_id)(
partition p1 values in (1,2,3,6,9),
partition p2 values in (4,5,10,22,23),
partition p3 values in (7,8,11,12,13),
partition p4 values in (14,15,16,17,20),
partition p5 values in (18,19,21,24,25)
);
这里的主键设置的是(cid,parent_id),因为cid是auto_increment,所以他就是唯一的了。
问题就是:cid做为主键和(cid,parent_id)做为主键有什么区别?
是因为用(cid,parent_id)做为主键的话相当于有了两个索引吗?
以前在我的概念里主键更多的是起唯一标识的作用,没别的含义。
谢谢高人指点一番。

解决方案 »

  1.   

    主键是主键,索引是索引!
    用(cid,parent_id)作为主键是它们两个一起具有唯一性。
      

  2.   

    create table category_part( 
    cid int unsigned not null auto_increment,
    cname varchar(64) not null,
    parent_id int not null,
    primary key (cid,parent_id))
    partition by list(parent_id)(
    partition p1 values in (1,2,3,6,9),
    partition p2 values in (4,5,10,22,23),
    partition p3 values in (7,8,11,12,13),
    partition p4 values in (14,15,16,17,20),
    partition p5 values in (18,19,21,24,25)
    );
    这里的主键设置的是(cid,parent_id),因为cid是auto_increment,所以他就是唯一的了。
    问题就是:cid做为主键和(cid,parent_id)做为主键有什么区别?
    是因为用(cid,parent_id)做为主键的话相当于有了两个索引吗?
    以前在我的概念里主键更多的是起唯一标识的作用,没别的含义。
    谢谢高人指点一番。
    从这个表结构而言,这样创建主键是因为:parent_id字段是作为分区字段的作用;分区字段有一个硬性要求:若是分区表有主键则为簇索引或无主键时有非空唯一则为簇索引的情况下,分区字段必须作为簇索引 或簇索引的一部分;关于InnoDB引擎索引的问题可以查阅网站:www.mysqlops.com 上的资料,自己站内搜索下: innodb 主键选型
      

  3.   

    并不唯一。会有重复的CID,你可以做个实验。不同parent_id下会有相同的CID。
      

  4.   

    cid做为主键和(cid,parent_id)做为主键有什么区别?
    第二个完全没有意义
      

  5.   

    有道理,我看了http://www.mysqlops.com/2011/09/10/innodb-primary.html
    这篇文章,我在想如果我先建的表,数据都插好了,再分区,是不是得先删除主键,重新建立主键呢?没做过实际的东西,就看着yueliangdao0608的文章做过试验。不知道这个分区表一般都是什么时候做的。
      

  6.   

    我试了下,cid确实会重复,不过跟parent_id有关系的,我在想应该是因为(cid,parent_id)是主键。如果我只把cid做为主键就不会有重复了。这个问题我表达的不是很清楚,我现在也还没有说很明白。不过老金明白我什么意思了。我现在对auto_increment 也有点晕了,为什么会重复呢?我得再去查查资料去。