mySQL>>规范化以逗号分隔的字段

时间:2017-11-08 20:44:47

标签: mysql parsing database-normalization delimited

我目前有一个名为“RESOURCES”的表,其中包含一个名为“RES_Tags”的关键字字段。 “RES_Tags”字段包含以逗号分隔的每条记录的关键字列表。

我需要规范化这个表/字段。

我已经设置了以下表格:TAGS,TAGS_TO_RESOURCES。

请参阅此处的架构:http://sqlfiddle.com/#!9/edac4/1

什么是允许我解析RES_Tags中的关键字的查询,将它们写入TAGS表而不创建重复项,然后在TAGS_TO_RESOURCES表中写一个列表?

2 个答案:

答案 0 :(得分:1)

请将您的代码复制到实际发布中,并提供您尝试用来解决问题的代码。

substring_index函数返回一个字符串的一部分,带有一些分隔符(这里是一个逗号),当一个负索引被传递时,它开始搜索来自另一侧的匹配,所以-1抓取一个项目否则是多项目清单(索引> = 2)。

根据我们的讨论,我已经调整了我是如何做到的,并展示了使用自动增量的示例。 (这是在小提琴的“构建模式”部分中运行的。)

create table TAGS
(`T_ID` int auto_increment primary key, `T_Name` varchar(18))
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(RES_Tags, ',', 1) as X
    FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 2)
      ,',',-1)
  FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 3)
      ,',',-1)  as X
  FROM RESOURCES
;
insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 4)
      ,',',-1)  as X
  FROM RESOURCES
  ;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 5)
      ,',',-1)  as X
  FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 6)
      ,',',-1)  as X
  FROM RESOURCES
;

create table New_TAGS like TAGS;
insert into New_TAGS (T_Name)
  select distinct trim(T_Name)
  from TAGS;

drop table TAGS;
rename table NEW_TAGS to TAGS;

documentation of the substring function Possible duplication of this question

答案 1 :(得分:1)

  1. 基于RESOURCES.RES_tags创建INSERT ... INTO TAGS ...语句集。使用UNIQUETAGS中的ON DUPLICATE KEY ...约束或使用INSERT ... SELECT ... NOT EXISTS()阻止重复:
  2. a)动态地将一些字符附加到RES_tags的开头并且将不同的字符附加到结尾(比如说 - 开始,+到结束) - 但是不要将它保存回DB({{1将转换为a,b,c

    b)将每个“,”转换为结束前一个-a,b,c+语句并从下一个开始;将' - '替换为仅启动,'+;仅限结尾部分(例如INSERT替换为-insert into tags(tag) values("变为+'"), - 但为了保持其独特性它将被要求添加步骤#1)中提到的东西

    1. 执行#1生成的SQL(例如"), ("

    2. 使用以下标签链接实体:

      insert into tags(tag) values("a"), ("b"), ("c")