MySQL-mysql 如何实现在一张表里某个字段根据另一个字段自增长

意见反馈 意见反馈 主题:991 回复:2082

MySQL-mysql 如何实现在一张表里某个字段根据另一个字段自增长

夜无邪 发布于 2017-01-19 字数 391 浏览 1104 回复 6

在mysql语法里,只允许一个字段设置成AUTO_INCREMENT,那在mysql能否实现一个字段值根据另一个字段值进行“自增长”,只所以加个引号,是因为第二个字段是某中意义上的自增长,看一下需求例子:

column_a   column_b     column_c ....
1 1
2 1
3 1
4 1
1 2
2 2
1 3

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(6

浮生未歇 2017-08-13 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/

甜柠檬 2017-06-06 5 楼

可以用触发器解决,CREATE TRIGGER test BEFORE INSERT ON ....后面省略,也可以调用存储过程,当然缺点也很明显,trigger的开销比较大;
或者直接在程序中实现,在执行insert的语句的时候就把字段A的值按照规则去生成好,insert进去

想挽留 2017-05-23 4 楼

这个我想是没有这种自动增长的类型。
不过要实现你这种功能,且你以后估计增长方式的规则也会改变。
所以推荐你使用触发器来做。

我想触发器也是用于完成这种工作存在D。

夜无邪 2017-04-07 3 楼

我认为这种情况用视图处理会比较好。
视图可以已这个表为主表,
添加类似 select base.cloumn_b+1 as cloumn_C

泛泛之交 2017-03-01 2 楼

我刚才尝试一下这样建表是可以实现的:

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的话会根据第一个来计算。

泛泛之交 2017-02-15 1 楼

这样的需求可以放在业务里做也可以放在MySQL里弄,在业务需求里就不说了,如果放在MySQL里做,那么可以通过触发器来实现,当insert的时候,执行触发器,然后再里面select count(column_b) from table where column='值',最后再把这个值update到column_a就行了,这样应该会比较方便一点。