首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL CSV行到多行

MySQL CSV行到多行
EN

Stack Overflow用户
提问于 2011-02-18 20:57:30
回答 2查看 1.2K关注 0票数 3

我需要将一个旧数据库迁移到我的新数据库。不幸的是,编写旧数据库的人使用带有逗号分隔的外键的字段创建了一个n,n关系。

我想写一个mysql查询(可能使用insert into ...select),它将那些逗号分隔的外键分开,这样我就可以构建一个表,其中每一行都是一个外键。

这个是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-18 21:38:42

在纯SQL中实现这一点并不简单。最简单的方法是使用您选择的编程语言依次检索每条记录,并根据逗号分隔字段插入多对多连接表记录。下面的伪代码建议了一种您可能会使用的方法:

代码语言:javascript
复制
for each (id, csv_foreign_keys) in source_rows do
    foreign_keys = split ',', csv_foreign_keys

    for each fk in foreign_keys do
        insert (id, fk) into many-to-many link table

完成此操作后,可以删除包含逗号分隔的外键的现有列。

票数 2
EN

Stack Overflow用户

发布于 2011-02-18 22:56:11

我的解决方案

代码语言:javascript
复制
DELIMITER $$

DROP FUNCTION IF EXISTS SPLITCVS $$
DROP PROCEDURE IF EXISTS MIGRATE $$

CREATE FUNCTION SPLITCVS (
 x VARCHAR(255),
 delim VARCHAR(12),
 pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '') $$

CREATE PROCEDURE MIGRATE () 
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE id INT(11);
    DECLARE csv BLOB;
    DECLARE cur CURSOR FOR SELECT uid,foreigns FROM old;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO id, csv;
        IF done THEN
          LEAVE read_loop;
        END IF;

        IF LENGTH(csv) <> 0 THEN
            SET @i = 0;
            SET @seps = LENGTH(csv) - LENGTH(REPLACE(csv, ',', ''));

            IF RIGHT(csv,1) <> ',' THEN
                SET @seps = @seps + 1;
            END IF;

            WHILE @i < @seps DO
                SET @i = @i + 1; 
                INSERT INTO db.newtable(uid_local,uid_foreign)
                VALUES (id,SPLITCVS(csv,',',@i));
            END WHILE;
        END IF;
    END LOOP;

    CLOSE cur;
END $$

CALL MIGRATE() $$

DROP FUNCTION SPLITCVS $$
DROP PROCEDURE MIGRATE $$
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5041537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档