MySQL-mysql 如何实现在一张表里某个字段根据另一个字段自增长
在mysql语法里,只允许一个字段设置成AUTO_INCREMENT,那在mysql能否实现一个字段值根据另一个字段值进行“自增长”,只所以加个引号,是因为第二个字段是某中意义上的自增长,看一下需求例子:
column_a column_b column_c ....
1 1
2 1
3 1
4 1
1 2
2 2
1 3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我的方法相对麻烦一点,但应该比以上都只管。
新建一张表 字段 A 自增 B字段为column_b的值
使用replace into的方法支持插入操作,然后通过get_last_insertid获取到A字段的值就能拿到了。
举个例子吧。引用:
column_a column_b column_c ....
1 1
2 1
3 1
4 1
1 2
2 2
1 3
针对以上的结构我的表目前应该是这个情况:
假设表名称为dd:
A B
4 1
2 2
1 3
OK 激动人心的时刻到了。
上表新增一条记录 比如column_b的值我输入1
这个时候呢,执行replace into dd(b) values(1)。然后执行mysql的 get_last_insert_id(方法名应该不是这个,查下手册吧)。这个时候你就知道了column_a的值应该是5了
扩展一下:
此方法最初是flickr首创,用来做分拆数据表处理自增字段的壹个方法。由于replace into是一个原子操作,并且该操作产生的记录数非常少,所以flickr的mysql集群中大量使用了该方法来统一处理自增问题。
附flickr的详细说明:
http://code.flickr.com/blog/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
可以用触发器解决,CREATE TRIGGER test BEFORE INSERT ON ....后面省略,也可以调用存储过程,当然缺点也很明显,trigger的开销比较大;
或者直接在程序中实现,在执行insert的语句的时候就把字段A的值按照规则去生成好,insert进去
这个我想是没有这种自动增长的类型。
不过要实现你这种功能,且你以后估计增长方式的规则也会改变。
所以推荐你使用触发器来做。
我想触发器也是用于完成这种工作存在D。
我认为这种情况用视图处理会比较好。
视图可以已这个表为主表,
添加类似 select base.cloumn_b+1 as cloumn_C
我刚才尝试一下这样建表是可以实现的:
CREATE TABLE mytable (
column_a INT NOT NULL AUTO_INCREMENT,
column_b INT NOT NULL,
column_c CHAR(30) NOT NULL,
column_d MEDIUMINT NOT NULL,
PRIMARY KEY (column_b,column_a)
) ENGINE=MyISAM;
INSERT INTO mytable (column_b, column_c, column_d) VALUES(1,'aa',11),(1,'bb',11),(2,'cc',22),(1,'dd',11),(2,'ee',22),(3,'ff',33),(1,'gg',11),(2,'hh',22);
之前对组合索引的顺序没怎么注意,原理就是建立一个组合索引,如果组合所以第二个字段值是auto_increment的话会根据第一个来计算。
这样的需求可以放在业务里做也可以放在MySQL里弄,在业务需求里就不说了,如果放在MySQL里做,那么可以通过触发器来实现,当insert的时候,执行触发器,然后再里面select count(column_b) from table where column='值',最后再把这个值update到column_a就行了,这样应该会比较方便一点。