mysql自增长联合主键

        今天因为业务需求设计了一个数据库表,表里面包含type和id两个字段,我期望id是根据type来自增长的,也就是说对于不同的type,id都是从1开始自增长的,所以表示这样创建的(数据库用的mysql):

create table mytable(type int, id int auto_increment, ..., PRIMARY KEY  (`type`,`id`))ENGINE=InnoDB;
 
 
但是mysql提示错误,错误信息如下:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

        网上查了下原因,应该是存储引擎的影响。我创建表时用的存储引擎是InnoDB,但是InnoDB似乎要求auto_increment类型的字段在数据库中必须拥有独立的索引,不能是联合索引,所以这样创建表也可以了:

create table mytable(type int, id int auto_increment unique, ..., PRIMARY KEY  (`type`,`id`))ENGINE=InnoDB;
 
 
        这样虽然表格建立起来了,但是业务上还没有达到我的要求,以为这样id虽然还是自增长的,但是它不是根据type的不同从1开始,而是根据记录的增加一直增长下去。于是为了达到需求只有换了一种存储引擎:

create table mytable(type int, id int auto_increment, ..., PRIMARY KEY  (`type`,`id`))ENGINE=MyIsAM;
 
 
然后执行如下语句


 
 
  1. insert into mytable(type) values(1);
  2. insert into mytable(type) values(1);
  3. insert into mytable(type) values(2);
  4. insert into mytable(type) values(2);
查看数据可以发现里面的数据如期望的那样:

+------+----+
| type | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    2 |  1 |
|    2 |  2 |
+------+----+

 

     最后还有一点需要注意的是自增长的字段不要放在索引的第一列,不然还是不会随着type的改变重新开始自增长,例如如果这样创建表:

create table mytable(type int, id int auto_increment, ..., PRIMARY KEY  (`id`,`type`))ENGINE=MyIsAM;
 
 

 
 
 

这个时候再执行上面的插入语句之后结果如下:

+------+----+
| type | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    2 |  3 |
|    2 |  4 |
+------+----+
    可以发现自增长的方式是受索引影响的。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值