如何为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”前面缺少一个结束括号。)