将递增的整数值分配给mysql数据库中的列

Posted

技术标签:

【中文标题】将递增的整数值分配给mysql数据库中的列【英文标题】:Assign increasing integer values to a column in mysql database 【发布时间】:2020-04-18 18:37:24 【问题描述】:

我们有一个应用程序,其中我们有一些学习路径,并且每个学习路径都与一些课程相关联。学习路径和课程之间的关联存储在 mysql 表中。现在我们还想将课程位置存储在课程映射的学习路径中,所以我在表中添加了另一列“位置”,我想通过查询回填其中的现有数据,以便为每门课程分配一个数字以任何随机方式从 1 开始(每个学习路径的数字应从 1 开始)。例如,

LP1|C1         LP1|C1|1
LP1|C2   ==>   LP1|C2|2
LP1|C3         LP1|C3|3
LP2|C1         LP2|C1|1
LP2|C5         LP2|C5|2

【问题讨论】:

【参考方案1】:

如果您运行的是 MySQL 8.0,您可以使用 row_number() 来实现:

select 
    learning_path, 
    course, 
    row_number() over(partition by learning_path order by course) position
from mytable

如果您需要update 查询:

update mytable t
inner join (
    select 
        learning_path, 
        course, 
        row_number() over(partition by learning_path order by course) position
    from mytable
) t1 on t1.learning_path = t.learning_path and t1.course = t.course
set t.position = t1.position

在早期版本中,一种选择是:

update mytable t
inner join (
    select 
        learning_path, 
        course, 
        (select 1 + count(*) from mytable t1 where t1.learning_path = t.learning_path and t1.course < t.course) position
    from mytable t
) t1 on t1.learning_path = t.learning_path and t1.course = t.course
set t.position = t1.position

【讨论】:

假设(并非不合理)数字不超过 9 我们使用的是 5.7.12 版本 @Strawberry:是的,否则 OP 需要像 'Cnn' 这样的课程。 @ManishRichhariya:我在答案中添加了对早期版本的查询。 是的,或者只是'n'。

以上是关于将递增的整数值分配给mysql数据库中的列的主要内容,如果未能解决你的问题,请参考以下文章

不正确的整数值:''对于第1行的列'id'

MySQL 如何从 varchar 列中获取精确的整数值

错误代码:1366。不正确的整数值:第 2 行的列“ReportsTo”的“NULL”

如何匹配在linq中具有多个用逗号分隔的整数值的列?

不断收到此错误-不正确的整数值:第 1 行的列 'poi_id' 的'')[关闭]

MySQL 列的整数值“不正确”,它是整数并允许为空?