MySQL:如何向表中添加新的id列,按旧列分组?

MySQL:如何向表中添加新的id列,按旧列分组?,mysql,group-by,auto-increment,alter-table,Mysql,Group By,Auto Increment,Alter Table,我试图将列new\u id添加到MySQL Workbench中的表中,但我希望此new\u id按old\u id分组 ALTER TABLE candidate ADD COLUMN new_id int not null auto_increment UNIQUE FIRST, ADD PRIMARY KEY(old_id, new_id); 我尝试了下面的代码。new\u id是自动增加的,但它不是按old\u id分组的 ALTER TABLE candidate ADD COLUM

我试图将列
new\u id
添加到MySQL Workbench中的表中,但我希望此
new\u id
old\u id
分组

ALTER TABLE candidate
ADD COLUMN new_id int not null auto_increment UNIQUE FIRST,
ADD PRIMARY KEY(old_id, new_id);
我尝试了下面的代码。
new\u id
是自动增加的,但它不是按
old\u id
分组的

ALTER TABLE candidate
ADD COLUMN new_id int not null auto_increment UNIQUE FIRST,
ADD PRIMARY KEY(old_id, new_id);
下面是我得到的:

+----------+--------+
| old_id   | new_id |
+----------+--------+
| 00132004 |    1   |
| 00132004 |    2   |
| 00132004 |    3   |
| 00132004 |    4   |
| 00118685 |    5   |
| 00118685 |    6   |
| J99999   |    7   |
| J99999   |    8   |
| J99988   |    9   |
| J99987   |   10   |
+----------+--------+
但这就是我想要的:

我在这里错过了什么。。。。? 谢谢你

您想要的东西(遗憾的是)不能用自动递增列来完成

另一种解决办法可以是:

CREATE TABLE mytab (new_id int not null auto_increment,
old_id VARCHAR(200),
FOREIGN KEY old_id (old_id) REFERENCES candidate(old_id));

CREATE UNIQUE INDEX old_id_idx ON mytab(old_id);
这保证了唯一的旧\u id,并作为回报为您提供唯一的新\u id。现在,您可以使用内部联接将这个新的\u id与候选表联接起来,并获得您想要的结果。

您想要的东西(遗憾的是)不能用自动递增列来完成

另一种解决办法可以是:

CREATE TABLE mytab (new_id int not null auto_increment,
old_id VARCHAR(200),
FOREIGN KEY old_id (old_id) REFERENCES candidate(old_id));

CREATE UNIQUE INDEX old_id_idx ON mytab(old_id);

这保证了唯一的旧\u id,并作为回报为您提供唯一的新\u id。现在,您可以使用内部联接将此新的\u id与候选表联接,并获得所需的结果。

添加列,然后使用
更新设置它:

set @old_id = '', @rn = 0;

update candidate
    set new_id = if(@old_id = old_id, @rn,
                    if(@old_id := old_id, @rn := @rn + 1, @rn := @rn + 1)
                   )
    order by old_id;

添加列,然后使用
update
进行设置:

set @old_id = '', @rn = 0;

update candidate
    set new_id = if(@old_id = old_id, @rn,
                    if(@old_id := old_id, @rn := @rn + 1, @rn := @rn + 1)
                   )
    order by old_id;

您对
new\u id
的新要求将无法使该列自动递增,因为这样一来,值将不会是唯一的或递增的

你要找的是所谓的密集等级。MySQL没有对此的内置支持,但您可以使用会话变量进行模拟:

SET @dense_rank = 0;
SET @old_id = NULL;

SELECT
    @dense_rank:=CASE WHEN @old_id = old_id
                      THEN @dense_rank ELSE @dense_rank + 1 END AS dr,
    @old_id:=old_id AS old_id,
    new_id
FROM candidate
ORDER BY new_id
请注意,因为MySQL不支持任何自动维护密集排名的干净方式,所以
SELECT
查询可能是您最好的长期选择。这样,您就可以随时根据最新数据计算密集秩,而无需担心在实际表中维护它

输出:

此处演示:


您对
新id
的新要求将无法使该列自动递增,因为这样的值将不会是唯一的或递增的

你要找的是所谓的密集等级。MySQL没有对此的内置支持,但您可以使用会话变量进行模拟:

SET @dense_rank = 0;
SET @old_id = NULL;

SELECT
    @dense_rank:=CASE WHEN @old_id = old_id
                      THEN @dense_rank ELSE @dense_rank + 1 END AS dr,
    @old_id:=old_id AS old_id,
    new_id
FROM candidate
ORDER BY new_id
请注意,因为MySQL不支持任何自动维护密集排名的干净方式,所以
SELECT
查询可能是您最好的长期选择。这样,您就可以随时根据最新数据计算密集秩,而无需担心在实际表中维护它

输出:

此处演示:


自动递增列将为每个新记录生成一个新值。它不会(也不应该)生成与其他行中的值重复的值。如果您确实需要类似的内容,则必须创建一个before insert触发器,并计算要放入列中的值。每行的自动增量增量。你不能改变这一点。如果您想要一个自动递增的非唯一id,您可能需要为它编写一个自定义函数。自动递增列将为每个新记录生成一个新值。它不会(也不应该)生成与其他行中的值重复的值。如果您确实需要类似的内容,则必须创建一个before insert触发器,并计算要放入列中的值。每行的自动增量增量。你不能改变这一点。如果您想要一个自动递增的非唯一id,您可能需要为它编写一个自定义函数。Gordon,如果要向表中添加新数据,这可能会变得很麻烦,因为我们每次都必须运行此更新(可能)。Gordon,如果要向表中添加新数据,这可能会变得很麻烦,因为我们每次都必须运行此更新(可能)。