MySQL 中将使用逗号分隔的字段转换为多行数据

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

在实际开发中,当需要对包含多个字段连接符的数据进行查询与迁移时,可以使用SQL中的SUBSTRING_INDEX函数结合一些辅助表的特性进行数据分割和迁移。通过合理的SQL编写,可以有效处理数据关联与拆分,达到迁移数据的目的。

🎯

关键要点

  • 在实际开发中,常需要存储使用连接符的数据。

  • 工单信息表bus_mark_info中的pages字段使用逗号连接多个页面。

  • 为了单独配置每个页面,添加了关联表bus_pages。

  • 需要将pages字段中的历史数据分割并存入新表。

  • 使用SQL语句进行数据迁移,结合SUBSTRING_INDEX函数。

  • 关联数据数量等于pages字段中逗号的数量加1。

  • 通过help_topic_id截取pages字段中的数据。

  • 注意help_topic_id最大值为700,处理的pages字段数量不能超过701。

  • 迁移数据的SQL语句示例已提供。

  • 合理的SQL编写可以有效处理数据关联与拆分。

延伸问答

如何将逗号分隔的字段转换为多行数据?

可以使用SQL中的SUBSTRING_INDEX函数结合辅助表进行数据分割和迁移。

在MySQL中,如何处理包含多个页面的字段?

可以将多个页面存储在一个字段中,使用逗号分隔,并通过关联表进行单独配置。

使用SUBSTRING_INDEX函数的具体步骤是什么?

首先使用SUBSTRING_INDEX截取到help_topic_id+1个逗号之前的部分,然后再截取该部分中最后一个逗号之后的值。

在数据迁移中,如何确保关联数据的数量正确?

关联数据的数量应等于pages字段中逗号的数量加1,可以通过计算实现。

如果pages字段的数量超过701,应该怎么处理?

需要使用其他表来替代,因为help_topic_id最大值为700,无法处理超过701个页面的数据。

迁移数据的SQL语句示例是什么?

INSERT INTO bus_pages(mark_id, page) SELECT T1.id, SUBSTRING_INDEX(SUBSTRING_INDEX(T1.pages, ',', T2.help_topic_id + 1), ',', -1) AS page FROM bus_mark_info T1 JOIN mysql.help_topic T2 ON T2.help_topic_id < (length(T1.pages) - length(REPLACE(T1.pages, ',', '')) + 1) WHERE T1.pages IS NOT NULL ORDER BY T1.id, T2.help_topic_id。

🏷️

标签

➡️

继续阅读