【发布时间】:2013-09-11 19:28:01
【问题描述】:
我正在尝试从旧的 MySQL 表中取出一个 blob 并为其创建一个新表,以达到第一个正常形式。然而,将数据库中已有的数据从 blob 转换为新表中的多行并非易事。
用SQL命令实现转换最简单的方法是什么?
父表:
CREATE TABLE TEST.People (
`id` INT AUTO_INCREMENT,
`age` INT,
`height` INT,
`weight` INT ,
`variations` BLOB DEFAULT NULL,
PRIMARY KEY (`id`),
);
新表:
CREATE TABLE TEST.Variations (
`id` INT AUTO_INCREMENT,
`chr` INT,
`start` INT,
`stop` INT ,
`type` ENUM('SNP','INDEL','CNV') DEFAULT NULL,
PRIMARY KEY (`id`),
);
当我运行 SELECT id,variations FROM TEST.People; 我明白了:
+----+----------------------------------------------------------------------------------------------------------------------+
| id | variations |
+----+----------------------------------------------------------------------------------------------------------------------+
| 3 | xp t !3:124093754-124467278/CNVt 7:78030601-79638023/CNV |
| 6 | xp |
| 9 | xp |
| 12 | xp t !1:84289718-85466763/CNV |
| 15 | xp |
| 18 | xp |
| 21 | xp |
| 24 | xp |
| 27 | xp |
| 30 | xp t !10:166909544-166909544/SNPt !2:66903445-66903445/SNPt !2:166897864-166897864/CNVt !7:6892788-6892788/SNP |
+----+----------------------------------------------------------------------------------------------------------------------+
所以我希望 TEST.Variations 表在转换后是这样的:
+----+-----+-----------+-----------+----------+
| id | chr | start | stop | type |
+----+-----+-----------+-----------+----------+
| 3 | 3 | 124093754 | 124467278 | CNV |
| 3 | 7 | 78030601 | 79638023 | CNV |
| 12 | 1 | 84289718 | 85466763 | CNV |
| 30 | 10 | 166909544 | 166909544 | SNP |
| 30 | 2 | 66903445 | 66903445 | SNP |
| 30 | 2 | 166897864 | 166897864 | CNV |
| 30 | 7 | 6892788 | 6892788 | SNP |
+----+-----+-----------+-----------+----------+
【问题讨论】:
-
这很可能必须使用某种类型的正则表达式来完成。问题:当字符串在当前 blob 中重复时,
t是否总是出现在需要切分到单独列中的字符串之前?!是否与迁移有任何关系,还是应该像示例中那样忽略它? -
这在纯 MySQL 查询语言中很难做到和测试;解析
variationsblob 列的正确工具是 PHP 或 PERL 等字符串处理语言。 -
@amaster507 - 目前 MySQL 没有实现
REGEX_REPLACE- 类似的功能。 -
我没有说它确实如此......正如 OllieJones 所说,您将需要另一种语言来进行此更新并使用正则表达式
标签: mysql sql database migration