客户需要迁移大量数据,我觉得这个问题对于SO来说可能足够通用。
旧版系统
学生个人资料包含姓名,电子邮件等字段以及大学名称。大学名称用字符串表示,因此重复是很浪费和缓慢的。
我们的新表格
一种更有效的解决方案是创建一个名为university
的表,该表仅使用一次外键(university_id
)存储一次大学名称,而HTML下拉列表仅将university_id
张贴到服务器。例如,这使执行GROUP BY
查询的过程变得更快。进入数据库的新表单数据可以正常工作。
问题
我们如何编写一个查询来插入所有其他列(first_name
,last_name
,email
,...),但随后又而不是插入{{ 1}}字符串,从university
表中找出其university_id
并插入相应的int而不是原始字符串?(场景:数据位于CSV文件中,我们将对其进行处理INSERT INTO语法)
非常感谢。
答案 0 :(得分:2)
将INSERT INTO ... SELECT
与LEFT JOIN
一起使用。选择“左”,以便如果学生记录的university_name值为空,则该记录不会被丢弃。
INSERT INTO students_new(first_name, last_name, email, university_id)
SELECT s.first_name, s.last_name, s.email, u.university_id
FROM students_old s
LEFT JOIN university u ON s.university_name = u.university_name
表和列的名称将替换为真实的。以上假设您为持有大学外键的学生创建的新表为students_new
,而旧表(归一化之前)为students_old
。