按组自动递增
Posted
技术标签:
【中文标题】按组自动递增【英文标题】:auto_increment by group 【发布时间】:2010-10-15 05:17:52 【问题描述】:mysql(特别是 5.0)有没有办法让 auto_increment 字段的值基于分组列?
例子:
id name group_field
1 test 1
2 test2 1
1 test3 2
2 test4 2
1 test5 3
2 test6 3
我不想通过任何“疯狂”的方法来实现这一点,但如果有必要的话。
【问题讨论】:
【参考方案1】:对于 MyISAM 和 BDB 表,您可以将 auto_increment 字段作为键的次要部分,例如
CREATE TABLE foo (
id INT AUTO_INCREMENT NOT NULL,
group_field INT NOT NULL,
name VARCHAR(128),
PRIMARY KEY(group_field, id)
);
manual 对此是这么说的
在这种情况下,生成的值为 AUTO_INCREMENT 列是 计算为 MAX(auto_increment_column) + 1 哪里 前缀=给定前缀。这很有用 当您想将数据排序时 组。
【讨论】:
由于手册只提到了 MyISAM 和 BDB,我猜不会。另见dev.mysql.com/doc/refman/5.0/en/… AUTO_INCREMENT 必须在主键上 - 如果您尝试创建一个在键外使用它的表,您将收到错误 1075“表定义不正确;只能有一个自动列并且它必须被定义为一个键” 这对于多个并发插入是否安全? 是的,看看dev.mysql.com/doc/refman/8.0/en/… 了解更多关于 InnoDB 处理 auto_increment 的深度【参考方案2】:你有没有想过composite primary keys?
【讨论】:
【参考方案3】:您可以通过插入触发器来实现这一点,通过 group_field 的 group_fileld = @inserted_group 从表组设置 max(id);
【讨论】:
以上是关于按组自动递增的主要内容,如果未能解决你的问题,请参考以下文章
R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和使用tapply函数按组聚合求和按组聚合求和(使用dplyr包)