将mySQL数据结构转换为新的关系数据库(逗号分隔为关系表)

时间:2015-12-11 17:49:58

标签: mysql bash transform

我有几个mySQL表,我已经保存了子表逗号分隔的关系ID。现在我必须将这些条目转移到一个新表中,其中每个关系都是一个条目。

是否有一种简单的方法可以将导入查询转换为正确的格式?

这里的数据示例,我的旧表(cat_projects)包含我想要转换的以下条目:

-- export of table cat_projects
INSERT INTO `cat_projects` (`id`, `authors`) VALUES
(2, '4,1'),
(3, '0'),
(4, '8,4,1'),
(5, '13,12'),
(10, '19,4,1'),
(13, ''),
(14, ''),
(15, '28,27,25,12,9,1');

这个条目我只想写入新的关系表(cat_project_relation)。 att_id链接到另一个表格,其中我保存了旧authors列的设置:

-- att_id = 58 
-- item_id = id
-- value_sorting = counting from 0 for each item_id
-- value_id = for each relation one entry value
INSERT INTO `cat_project_relation` (`att_id`, `item_id`, `value_sorting`, `value_id`) VALUES
(58, 2, 0, '4'),
(58, 2, 1, '1'),
(58, 3, 0, '0'),
(58, 4, 0, '8'),
(58, 4, 1, '4'),
(58, 4, 2, '1'),
(58, 5, 0, '13'),
(58, 5, 1, '12'),
(58, 10, 0, '19'),
(58, 10, 1, '4'),
(58, 10, 2, '1'),
(58, 13, 0, ''),
(58, 14, 0, ''),
(58, 15, 0, '28'),
(58, 15, 1, '27'),
(58, 15, 2, '25'),
(58, 15, 3, '12'),
(58, 15, 4, '9'),
(58, 15, 5, '1');

我希望很清楚我想要实现的目标。是否可以直接在SQL中执行此操作,还是必须应用外部bash脚本?

1 个答案:

答案 0 :(得分:0)

实际上,并没有像我想的那样编写一个小的bash脚本。我想它是更简单的解决方案,然后在SQL中编写一些东西。

#!/bin/bash

# input table
table="(2, '4,1'),
(3, '0'),
(4, '8,4,1'),
(5, '13,12'),
(10, '19,4,1'),
(13, ''),
(14, ''),
(15, '28,27,25,12,9,1');"

# fixed attribute id
att_id=58

# read each line into an array
readarray -t y <<<"$table"

# for each array item (each line)
for (( i=0; i<${#y[*]}; i=i+1 ))
do
    z=${y[$i]}
    # split by comma into array
    IFS=', ' read -r -a array <<< "$z"
    # loop through each value
    for (( j=0; j<${#array[*]}; j=j+1 ))
    do
        # remove all other characters then number
        nr=$(echo ${array[$j]} | sed 's/[^0-9]*//g')
        # each first value is the item_id 
        if [ $j -eq 0 ]
        then 
            item_id=$nr
        else
            k=$(expr $j - 1)
            value_id=$nr
            # print output line by line
            echo "($att_id, $item_id, $k, '$value_id')," >> output.txt                
        fi
    done    
done

结果将与问题中的问题一致。