如何在MySQL中基于updated_at列生成desc_id列(按时间从旧到新降序)
实现步骤说明
假设你的表名为your_table_name,请替换为实际表名,按以下步骤操作:
1. 添加desc_id列
首先给表新增一个用于存储目标ID的列:
ALTER TABLE your_table_name ADD COLUMN desc_id INT;
2. 计算并更新desc_id值
方法一:MySQL 8.0及以上版本(推荐,支持窗口函数)
利用ROW_NUMBER()窗口函数,按updated_at从新到旧排序,直接生成对应ID:
UPDATE your_table_name t JOIN ( SELECT id, ROW_NUMBER() OVER (ORDER BY updated_at DESC) AS new_desc_id FROM your_table_name ) AS sub ON t.id = sub.id SET t.desc_id = sub.new_desc_id;
方法二:MySQL 5.x版本(兼容旧版本)
使用用户变量来实现排序计数:
SET @row_num = 0; UPDATE your_table_name t JOIN ( SELECT id, (@row_num := @row_num + 1) AS new_desc_id FROM your_table_name ORDER BY updated_at DESC ) AS sub ON t.id = sub.id SET t.desc_id = sub.new_desc_id;
3. 可选:优化列属性
如果需要确保desc_id不为空,可以修改列属性:
ALTER TABLE your_table_name MODIFY COLUMN desc_id INT NOT NULL;
补充说明
- 如果存在多条记录
updated_at完全相同的情况,若希望相同时间的记录拥有相同的desc_id,可以将ROW_NUMBER()替换为RANK()或DENSE_RANK(),具体根据你的需求选择。
内容的提问来源于stack exchange,提问作者Tammapao
相关产品推荐
相关产品推荐

