PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment remplir les clés étrangères d'une table à partir d'autres tables

Cela peut être simplifié en :

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

J'ai ajouté un ORDER BY clause dont vous n'avez pas strictement besoin, mais certaines requêtes peuvent être utiles si vous insérez vos données regroupées de cette manière (ou d'une autre manière).

Si vous voulez éviter de perdre des lignes où vous ne pouvez pas trouver une ligne correspondante en language ou template , faites-le LEFT JOIN au lieu de JOIN pour les deux tables (à condition que language_id et template_id peut être NULL .

En plus de ce que j'ai déjà répertorié sous la question préquelle  :Si l'INSERT est énorme et constitue une grande partie de la table cible, il est probablement plus rapide de DROP tous les index sur la table cible et recréez-les ensuite. Créer des index à partir de zéro est beaucoup plus rapidement que de les mettre à jour progressivement pour chaque ligne.

Les index uniques servent également de contraintes, vous devrez donc déterminer s'il faut appliquer les règles plus tard ou les laisser en place.