如何从其他表填充表的外键

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表的最佳查询是什么。有任何想法吗?

Erw*_*ter 5

可以简化为:

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_idtemplate_id可以为)NULL

除了我已经在先决问题下列出的内容之外:如果INSERT很大并且在目标表中占很大的比例,那么删除目标表上的所有索引并随后重新创建它们可能会更快。从头开始创建索引快得多,然后每行逐步更新它们。

唯一索引还充当约束,因此您必须考虑是稍后执行规则还是将规则保留在原地。