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,如果要向表中添加新数据,这可能会变得很麻烦,因为我们每次都必须运行此更新(可能)。