PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So füllen Sie die Fremdschlüssel einer Tabelle aus anderen Tabellen

Dies kann vereinfacht werden zu:

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

Ich habe einen ORDER BY hinzugefügt Klausel, die Sie nicht unbedingt benötigen, aber bestimmte Abfragen können davon profitieren, wenn Sie Ihre Daten auf diese (oder eine andere) Weise geclustert einfügen.

Wenn Sie vermeiden möchten, dass Zeilen verloren gehen, wenn Sie keine übereinstimmende Zeile in language finden oder template , machen Sie daraus LEFT JOIN statt JOIN für beide Tabellen (vorausgesetzt, dass language_id und template_id kann NULL sein .

Zusätzlich zu dem, was ich bereits unter der Vorabfrage aufgeführt habe :Wenn der INSERT sehr groß ist und einen großen Teil der Zieltabelle ausmacht, ist es wahrscheinlich schneller, alle Indizes zu löschen auf der Zieltabelle und erstellen Sie sie anschließend neu. Das Erstellen von Indizes von Grund auf ist viel schneller, als sie inkrementell für jede Zeile zu aktualisieren.

Eindeutige Indizes dienen zusätzlich als Einschränkungen, sodass Sie überlegen müssen, ob Sie die Regeln später durchsetzen oder sie beibehalten möchten.