sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan udfyldes en tabels fremmednøgler fra andre tabeller

Dette kan forenkles til:

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

Jeg tilføjede en ORDER BY klausul, som du strengt taget ikke har brug for, men visse forespørgsler kan have gavn af, hvis du indsætter dine data grupperet på den (eller anden) måde.

Hvis du vil undgå at miste rækker, hvor du ikke kan finde en matchende række på language eller template , gør det LEFT JOIN i stedet for JOIN for begge tabeller (forudsat at language_id og template_id kan være NULL .

Ud over det, jeg allerede har angivet under prequel-spørgsmålet :Hvis INSERT er enorm og udgør en stor del af måltabellen, er det sandsynligvis hurtigere at DROP alle indekser på målbordet og genskab dem bagefter. At oprette indekser fra bunden er meget hurtigere end at opdatere dem trinvist for hver række.

Unikke indekser fungerer desuden som begrænsninger, så du bliver nødt til at overveje, om du vil håndhæve reglerne senere eller lade dem være på plads.



  1. Din ultimative guide til SQL Join:CROSS JOIN – Del 3

  2. Postgres kan ikke oprette forbindelse til serveren på Unix-domæne-socket 5432

  3. Sådan grupperer du hierarkiske relationer i SQL Server

  4. inkludere mysql i cmake