이전 데이터베이스를 새 데이터베이스로 마이그레이션해야합니다. 불행히도 이전 데이터베이스를 작성한 사람은 쉼표로 분리 된 외래 키가있는 필드를 사용하여 n, n 관계를 작성했습니다.MySQL CSV 행을 여러 행으로
나는 각 행이 외래 키인 테이블을 만들 수 있도록 쉼표로 구분 된 외래 키를 분할하는 mysql 쿼리 (아마도 insert into select를 사용)를 작성하고 싶습니다.
이것이 가능합니까?
이전 데이터베이스를 새 데이터베이스로 마이그레이션해야합니다. 불행히도 이전 데이터베이스를 작성한 사람은 쉼표로 분리 된 외래 키가있는 필드를 사용하여 n, n 관계를 작성했습니다.MySQL CSV 행을 여러 행으로
나는 각 행이 외래 키인 테이블을 만들 수 있도록 쉼표로 구분 된 외래 키를 분할하는 mysql 쿼리 (아마도 insert into select를 사용)를 작성하고 싶습니다.
이것이 가능합니까?
순수 SQL에서는이 작업을 수행하는 것이 쉽지 않습니다. 원하는 프로그래밍 언어를 사용하여 각 레코드를 차례로 검색하고 쉼표로 구분 된 필드를 기반으로하는 다 대다 (many-to-many) 조인 테이블 레코드를 삽입하는 것이 가장 쉽습니다. 이 작업을 완료하면
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
는 쉼표을 잡고 기존의 열이 외부 키를 제거 할 수있는 분리 된 다음 의사 코드는 사용할 수있는 접근 방법을 제안한다.
내 솔루션
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 $$
덕분에, 작동이 내 솔루션입니다 –