我有以下表格,其中translation
是空的,我正在尝试填充:
translation {
id
translated
language_id
template_id
}
language {
id
langname
langcode
}
template {
id
tplname
source
domain
total
}
要填写的源数据translation
是我从外部 CSV 文件填充的临时表:
tmp_table {
id
translated
langname
tplname
source
domain
}
我想做的是填充translation
的值来自tmp_table
. The translated
字段可以直接复制,但我不太确定如何获取正确的language_id
(tmp_table.langname 可用于确定 language.id)和template_id
(tmp_table.tplname、tmp_table.source、tmp_table.domain 一起可用于确定 template.id)。
这可能是一个微不足道的问题,但我对 SQL 还很陌生,不确定最好的查询应该是什么来填充translation
桌子。有任何想法吗?
这可以简化为:
INSERT INTO translation (id, translated, language_id, template_id)
SELECT tmp.id, tmp.translated, l.id, t.id
FROM tmp_table tmp
JOIN language l USING (langname)
JOIN template t USING (tplname, source, domain)
ORDER BY tmp.id;
我添加了一个ORDER BY
您并不严格需要的子句,但如果您像这样(或其他方式)插入聚集的数据,某些查询可能会受益。
如果您想避免丢失在其中找不到匹配行的行language
or template
, 做了LEFT JOIN
代替JOIN
对于两个表(前提是language_id
and template_id
can be NULL
.
除了我已经列出的内容之外你之前的问题 https://stackoverflow.com/a/9423888/939860:如果INSERT
很大并且占目标表的很大一部分,可能会更快删除所有索引在目标表上,然后重新创建它们。从头开始创建索引是a lot比为每一行增量更新它们更快。
唯一索引也充当约束,因此您必须考虑是否稍后强制执行规则或保留它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)