Dav*_*lla 5 sql database postgresql foreign-keys
我有下表,其中的表translation是空的,我正在尝试填充:
translation {
id
translated
language_id
template_id
}
language {
id
langname
langcode
}
template {
id
tplname
source
domain
total
}
Run Code Online (Sandbox Code Playgroud)
要填充的源数据translation是我从外部CSV文件填充的临时表:
tmp_table {
id
translated
langname
tplname
source
domain
}
Run Code Online (Sandbox Code Playgroud)
我想做的是translation用中的值填充tmp_table。该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
Run Code Online (Sandbox Code Playgroud)
我添加了一个ORDER BY您严格不需要的子句,但是如果您插入以(或其他方式)集群的数据,某些查询可能会受益。
如果您想避免丢失在language或中找不到匹配行的行template,请使其LEFT JOIN代替JOIN两个表(前提是language_id和template_id可以为)NULL。
除了我已经在先决问题下列出的内容之外:如果INSERT很大并且在目标表中占很大的比例,那么删除目标表上的所有索引并随后重新创建它们可能会更快。从头开始创建索引要快得多,然后每行逐步更新它们。
唯一索引还充当约束,因此您必须考虑是稍后执行规则还是将规则保留在原地。