在 INSERT 上搜索和更新
Search and update on INSERT
客户需要迁移大量数据,我觉得这个问题对于 SO 来说可能足够通用。
旧系统
学生资料包含姓名、电子邮件等字段,以及大学名称。大学名称以字符串表示,因此会重复,既浪费又缓慢。
我们的新形态
一个更有效的解决方案是使用一个名为 university
的 table,它只使用外键 (university_id
) 和 HTML 下拉列表存储一次大学名称只需将 university_id
发布到服务器。例如,这使得执行 GROUP BY
查询的速度更快。进入数据库的新表单数据工作正常。
问题
我们如何编写一个查询来插入所有其他列(first_name
、last_name
、email
、...),然后 而不是插入 university
字符串,从 university
table 中找出其 university_id
并插入相应的 int 而不是原始字符串?(场景:数据是在我们将使用 INSERT INTO 语法操作的 CSV 文件中)
非常感谢。
使用 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
Table 和列名要替换为真实的。以上假设持有大学外键的学生的新 table 是 students_new
,而旧的(标准化之前的)是 students_old
.
客户需要迁移大量数据,我觉得这个问题对于 SO 来说可能足够通用。
旧系统
学生资料包含姓名、电子邮件等字段,以及大学名称。大学名称以字符串表示,因此会重复,既浪费又缓慢。
我们的新形态
一个更有效的解决方案是使用一个名为 university
的 table,它只使用外键 (university_id
) 和 HTML 下拉列表存储一次大学名称只需将 university_id
发布到服务器。例如,这使得执行 GROUP BY
查询的速度更快。进入数据库的新表单数据工作正常。
问题
我们如何编写一个查询来插入所有其他列(first_name
、last_name
、email
、...),然后 而不是插入 university
字符串,从 university
table 中找出其 university_id
并插入相应的 int 而不是原始字符串?(场景:数据是在我们将使用 INSERT INTO 语法操作的 CSV 文件中)
非常感谢。
使用 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
Table 和列名要替换为真实的。以上假设持有大学外键的学生的新 table 是 students_new
,而旧的(标准化之前的)是 students_old
.