如何为MySQL中的每个新人分配重新启动的自动递增ID?

如何为MySQL中的每个新人分配重新启动的自动递增ID?,mysql,auto-increment,Mysql,Auto Increment,如果我有这样一张桌子: PersonId Joe Joe Joe Joe Frank Frank Frank Frank PersonId id Joe 1 Joe 2 Joe 3 Joe 4 Frank 1 Frank 2 Frank 3 Frank 4 想让它看起来像这样: PersonId Joe Joe Joe Joe Fran

如果我有这样一张桌子:

PersonId   
Joe         
Joe
Joe
Joe
Frank
Frank
Frank
Frank
PersonId   id
Joe        1     
Joe        2
Joe        3
Joe        4
Frank      1
Frank      2
Frank      3
Frank      4
想让它看起来像这样:

PersonId   
Joe         
Joe
Joe
Joe
Frank
Frank
Frank
Frank
PersonId   id
Joe        1     
Joe        2
Joe        3
Joe        4
Frank      1
Frank      2
Frank      3
Frank      4
我该怎么做?类似于
alter table add id int auto_increment,add primary key(id)
,但在每个新名称后使用更多参数进行自动增量重置,并且没有主键,因为将有重复的值。

对于MyISAM和BDB表,可以在多列索引中的辅助列上指定自动增量。在这种情况下,自动增量列的生成值计算为MAX(自动增量列)+1,其中prefix=给定前缀。当您想要将数据放入有序的组中时,这非常有用


下面是一个示例,说明如何使用示例create table和insert脚本:

CREATE TABLE person(
    my_name VARCHAR(200)
);

INSERT INTO person VALUES ('Joe'), ('Joe'),('Joe'),('Joe'),('Frank'),('Frank'),('Frank'),('Frank');


SET @my_name := '';
SET @sort := 0;
SELECT 
    my_name
    , @sort := CASE WHEN @my_name = p.my_name THEN 
                @sort + 1
            ELSE 
                 1
            END AS sort_order
    , @my_name := p.my_name AS my_name
FROM 
    person p;

请尝试以下即时操作:

select personid, 
       (@rn := if(@p = personid, @rn + 1,
                  if(@p := personid, 1, 1)
                 )
       ) as id
from your_table cross join
     (select @rn := 0, @p := 0) vars
order by personId;

这与尤尔根的回答有两个不同之处。首先,有一个明确的
排序,因为您不能依赖于没有
排序的
选择
的排序。其次,正在使用的两个变量都在一个语句中赋值。MySQL不保证
select
中语句的求值顺序,因此唯一安全的方法是使用单个语句。

请记住
主键必须是唯一的,因此在新标识符后重新启动它是不可行的。是的,我在问题中说过这一点。我想知道如何在没有主键的情况下创建该列。可以,但必须将其保留为空,并通过sql或代码使用值进行更新。如果Joe#3被删除,您希望发生什么?您是否尝试阅读文档以实现自动增量?我真的不明白它是怎么工作的,谢谢你!(顺便说一下,“as id”前面缺少一个结束括号。)