рдбреАрдмреАрдП: рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдЖрдпрд╛рдд рдХреЛ рд╕рдХреНрд╖рдо рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ

рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП (рдЕрд▓рдЧ-рдЕрд▓рдЧ)ред рдИрдЯреАрдПрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ: рдЖрдпрд╛рдд, рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди) рдХреА рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ "рдпрд╛рдж рд░рдЦреЗрдВ" рдФрд░ рддреБрд░рдВрдд рддреНрд╡рд░рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ рдХреБрдЫ рд╡рд┐рд╢рд╛рд▓.

рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ: "рдпрд╣реАрдВ рд▓реЗрдЦрд╛ рд╡рд┐рднрд╛рдЧ рдЧреНрд░рд╛рд╣рдХ рдмреИрдВрдХ рд╕реЗ рдЙрддрд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдВрддрд┐рдо рдкреНрд░рд╛рдкреНрдд рднреБрдЧрддрд╛рди, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЦрд╛рддреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред"

рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕ "рдХреБрдЫ" рдХреА рдорд╛рддреНрд░рд╛ рд╕реИрдХрдбрд╝реЛрдВ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рдорд╛рдкреА рдЬрд╛рдиреЗ рд▓рдЧрддреА рд╣реИ, рдФрд░ рд╕реЗрд╡рд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде 24x7 рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдХрдИ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдВрдЧреЗред
рдбреАрдмреАрдП: рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдЖрдпрд╛рдд рдХреЛ рд╕рдХреНрд╖рдо рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ
PostgreSQL (рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдореЗрдВ рд╣реА рдирд╣реАрдВ) рдореЗрдВ рдЙрдирд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╣рд░ рдЪреАрдЬ рдХреЛ рддреЗрдЬреА рд╕реЗ рдФрд░ рдХрдо рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

1. рдХрд╣рд╛рдБ рднреЗрдЬрдирд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рддрдп рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХрд╣рд╛рдВ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо "рдкреНрд░реЛрд╕реЗрд╕" рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

1.1. рдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓ (рдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓)

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, PostgreSQL рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЕрдВрдзрд╡рд┐рд╢реНрд╡рд╛рд╕ рдкрд╕рдВрдж рд╣реИ "рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ". рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рднреА рд╣реИрдВред

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдЕрдкрдирд╛ "рдиреЗрдорд╕реНрдкреЗрд╕"ред

рдпрджрд┐ рджреЛ рдХрдиреЗрдХреНрд╢рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ CREATE TABLE x, рддреЛ рдХреЛрдИ рди рдХреЛрдИ рддреЛ рдорд┐рд▓реЗрдЧрд╛ рд╣реА рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рддреНрд░реБрдЯрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ.

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рджреЛрдиреЛрдВ рдЕрдорд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ CREATE TEMPORARY TABLE x, рддреЛ рджреЛрдиреЛрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рднреА рдХреЛ рдорд┐рд▓реЗрдЧрд╛ рдЖрдкрдХреА рдкреНрд░рддрд┐ рдЯреЗрдмрд▓. рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреБрдЫ рднреА рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛.

рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ "рдЖрддреНрдо-рд╡рд┐рдирд╛рд╢"ред

рдЬрдм рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ DROP TABLE x рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ...

рдпрджрд┐ рдЖрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдирджреЗрди рдореЛрдб рдореЗрдВ pgbouncer, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╣ рдорд╛рдирддрд╛ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдпрд╣ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИред

рдЗрд╕рд▓рд┐рдП, pgbouncer рд╕реЗ рднрд┐рдиреНрди рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдЗрд╕реЗ рджреЛрдмрд╛рд░рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ CREATE TEMPORARY TABLE IF NOT EXISTS x.

рд╕рдЪ рд╣реИ, рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдЖрдк "рдЕрдЪрд╛рдирдХ" рд╡рд╣рд╛рдВ "рдкрд┐рдЫрд▓реЗ рдорд╛рд▓рд┐рдХ" рд╕реЗ рдмрдЪрд╛ рд╣реБрдЖ рдбреЗрдЯрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдиреБрдЕрд▓ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ ON COMMIT DROP - рдпрд╛рдиреА, рдЬрдм рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рддреЛ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреАред

рдЧреИрд░рдкреНрд░рддрд┐рдХреГрддрд┐

рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдХреА рджреЛрд╣рд░реА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ рд╣реАрдк + рд╡рд╛рд▓ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ INSERT/UPDATE/DELETE рдмрд╣реБрдд рддреЗрдЬ рд╣реИред

рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдЕрднреА рднреА рдПрдХ "рд▓рдЧрднрдЧ рд╕рд╛рдорд╛рдиреНрдп" рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рдкрд░ рднреА рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдЪ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред

1.2. рдЕрдирд▓реЙрдЧреНрдб рдЯреЗрдмрд▓

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдмреЛрдЭрд┐рд▓ рдИрдЯреАрдПрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд▓реЗрдирджреЗрди рдХреЗ рднреАрддрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╣реИ рд▓реЗрдирджреЗрди рдореЛрдб рдореЗрдВ pgbouncer? ..

рдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдмреИрдВрдбрд╡рд┐рдбреНрде рдирд╣реАрдВ рд╣реИ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ (рдкрдврд╝реЗрдВ, рдкреНрд░рддрд┐ рд╕реАрдкреАрдпреВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛)?..

рдпрд╛ рдлрд┐рд░ рдХреЛрдИ рдСрдкрд░реЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ?..

рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдПрдХ рдЧреИрд░-рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ. рдкреБрди, рд╣рд╛рдБ. рд╡рд╣ рд╣реИ:

  • рдЕрдзрд┐рдХрддрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде "рдореЗрд░реА рдЕрдкрдиреА" рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдмрдирд╛рдИрдВ рддрд╛рдХрд┐ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рди рд╣реЛ
  • рдЙрджреНрдзрд░рдг: рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рджрд┐рдпрд╛
  • рдмрджрд╛рд▓рдирд╛: рдкрд░рд┐рд╡рд░реНрддрд┐рдд, рдХреБрдВрдЬреА рд▓рд┐рдВрдХрд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рднрд░реЗ рдЧрдП
  • рднрд╛рд░: рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛
  • "рдореЗрд░реА" рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд╣рдЯрд╛ рджреА рдЧрдИрдВ

рдФрд░ рдЕрдм - рдорд░рд╣рдо рдореЗрдВ рдПрдХ рдордХреНрдЦреА. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, PostgreSQL рдореЗрдВ рд╕рднреА рд▓реЗрдЦрди рджреЛ рдмрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ - рд╡рд╛рд▓ рдореЗрдВ рдкреНрд░рдердо, рдлрд┐рд░ рддрд╛рд▓рд┐рдХрд╛/рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВред рдпрд╣ рд╕рдм ACID рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рджреГрд╢реНрдпрддрд╛ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ COMMIT'рдЕрдЦрд░реЛрдЯ рдФрд░ ROLLBACK'рд╢реВрдиреНрдп рд▓реЗрдирджреЗрди.

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдпрд╛ рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕рдлрд▓ рд░рд╣рд╛ рдпрд╛ рдирд╣реАрдВред. рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХрд┐рддрдиреЗ рдордзреНрдпрд╡рд░реНрддреА рд▓реЗрдирджреЗрди рд╣реЛрдВрдЧреЗ - рд╣рдореЗрдВ "рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмреАрдЪ рд╕реЗ рдЬрд╛рд░реА рд░рдЦрдиреЗ" рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рдереАред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostgreSQL рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ, рд╕рдВрд╕реНрдХрд░рдг 9.1 рдореЗрдВ, рдРрд╕реА рдЪреАрдЬрд╝ рдкреЗрд╢ рдХреА рдЕрдирд▓реЙрдЧреНрдб рдЯреЗрдмрд▓:

рдЗрд╕ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде, рддрд╛рд▓рд┐рдХрд╛ рдЕрдирд▓реЙрдЧреНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдЕрдирд▓реЙрдЧреНрдб рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд░рд╛рдЗрдЯ-рдлрд╝реЙрд░рд╡рд░реНрдб рд▓реЙрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдзреНрдпрд╛рдп 29 рджреЗрдЦреЗрдВ), рдЬрд┐рд╕рд╕реЗ рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ. рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реЗ рдЕрд╕рдлрд▓рддрд╛ рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ; рд╕рд░реНрд╡рд░ рд╡рд┐рдлрд▓рддрд╛ рдпрд╛ рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╢рдЯрдбрд╛рдЙрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрдирд▓реЙрдЧреНрдб рдЯреЗрдмрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛. рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЕрдирд▓реЙрдЧреНрдб рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рдЧреБрд▓рд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдирд▓реЙрдЧреНрдб рдЯреЗрдмрд▓ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдирд▓реЙрдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ "рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ", рддреЛ рдпрд╣ рдЕрдкреНрд░рд┐рдп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд┐рддрдиреА рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдЖрдкрдХреА рдИрдЯреАрдПрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ "рдкреБрдирд░реНрдЬреАрд╡рд┐рдд" рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ "рдмреАрдЪ рд╕реЗ" рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдпрджрд┐ рдирд╣реАрдВ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓рд╛ рдЖрдкрдХреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ UNLOGGEDрд▓реЗрдХрд┐рди рдХрднреА рдирд╣реАрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рди рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛ рдЖрдкрдХреЛ рдкреНрд░рд┐рдп рд╣реИред

1.3. рдХрдорд┐рдЯ рдкрд░ {рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣рдЯрд╛рдПрдБ | рдмреВрдБрдж}

рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдЖрдкрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╕рдордп рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкрд░ ON COMMIT DROP рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдпрд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ DROP TABLE, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде ON COMMIT DELETE ROWS рд╕реНрдерд┐рддрд┐ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ - рдпрд╣ рдпрд╣рд╛рдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ TRUNCATE TABLE.

рдЪреВрдВрдХрд┐ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдореЗрдЯрд╛-рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдирд┐рдпрдорд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рддреЛ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЧрдВрднреАрд░ "рд╕реВрдЬрди" рд╣реЛ рдЬрд╛рддреА рд╣реИ pg_class, pg_attribute, pg_attrdef, pg_depend,тАж

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕реАрдзрд╛ рд╕рдВрдмрдВрдз рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд░реНрдордЪрд╛рд░реА рд╣реИ, рдЬреЛ рд╣рд░ рд╕реЗрдХрдВрдб рдПрдХ рдирдпрд╛ рд▓реЗрдирджреЗрди рдЦреЛрд▓рддрд╛ рд╣реИ, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рднрд░рддрд╛ рд╣реИ, рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдЯрд╛рддрд╛ рд╣реИ... рд╕рд┐рд╕реНрдЯрдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдЪрд░рд╛ рдЬрдорд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдмреНрд░реЗрдХ рд▓рдЧреЗрдВрдЧреЗред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕рд╛ рдордд рдХрд░реЛ! рдРрд╕реЗ рдореЗрдВ рдпрд╣ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИ CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS рдЗрд╕реЗ рд▓реЗрди-рджреЗрди рдЪрдХреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ - рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдирдП рд▓реЗрди-рджреЗрди рдХреА рд╢реБрд░реБрдЖрдд рддрдХ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрдВрдЧреА рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд░рд╣реЗрдЧрд╛ (рдХреЙрд▓ рд╕рд╣реЗрдЬреЗрдВ CREATE), рдкрд░рдВрддреБ рдЦрд╛рд▓реА рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреЛрд▓рдВрдмреЛ TRUNCATE (рд╣рдордиреЗ рдкрд┐рдЫрд▓рд╛ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреА рдХреЙрд▓ рднреА рд╕рд╣реЗрдЬреА рдереА)ред

1.4. рдЬреИрд╕реЗ...рд╕рд╣рд┐рдд...

рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдпрд╛рдд рд╣реИрдВ - рдФрд░ рдбреЗрд╡рд▓рдкрд░ рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдлрд╝реАрд▓реНрдб рдХреА рд╕реВрдЪреА рдХреЛ рдЕрдкрдиреЗ рдЕрд╕реНрдерд╛рдпреА рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ ...

рд▓реЗрдХрд┐рди рдЖрд▓рд╕реНрдп рдкреНрд░рдЧрддрд┐ рдХрд╛ рдЗрдВрдЬрди рд╣реИ! рдЗрд╕реАрд▓рд┐рдП "рдирдореВрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░" рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

CREATE TEMPORARY TABLE import_table(
  LIKE target_table
);

рдЪреВрдБрдХрд┐ рдЖрдк рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдЦреЛрдЬ рдХрд░рдирд╛ рдХрднреА рднреА рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ - рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛! рдФрд░ рд╣рд╛рдВ, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдПрдБ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ.

рдЪреВрдБрдХрд┐, рдЕрдХреНрд╕рд░, рдЖрд╡рд╢реНрдпрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдЖрдк рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ LIKE target_table INCLUDING INDEXES.

рдЕрдЧрд░ рдЖрдкрдХреЛ рднреА рдЪрд╛рд╣рд┐рдП DEFAULT-рдорд╛рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдорд╛рди рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ LIKE target_table INCLUDING DEFAULTS. рдпрд╛ рдХреЗрд╡рд▓ - LIKE target_table INCLUDING ALL - рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рдпрд╛рдБ рдбрд┐рдлрд╝реЙрд▓реНрдЯ, рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛, рдмрд╛рдзрд╛рдПрдБ,...

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдпреЗ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдиреЗ рдмрдирд╛рдпрд╛ рд╣реИ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рддрд╛рд▓рд┐рдХрд╛ рдЖрдпрд╛рдд рдХрд░реЗрдВ, рддреЛ рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕рдм рдХреБрдЫ рднрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЛ рд░реЛрд▓ рдХрд░рддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ рдкреАрдЬреА_рдбрдВрдк.

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, RTFM!

2. рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ?

рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдХрд╣рдирд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ COPY- "рдкреИрдХ" рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╡рд╛рд╣ INSERT, рдХрднреА-рдХрднреА рддреНрд╡рд░рдг. рдЖрдк рд╕реАрдзреЗ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдлрд╝рд╛рдЗрд▓ рд╕реЗ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

3. рдХреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВ?

рддреЛ, рдЪрд▓рд┐рдП рдЕрдкрдирд╛ рдкрд░рд┐рдЪрдп рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:

  • рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреНрд▓рд╛рдЗрдВрдЯ рдбреЗрдЯрд╛ рд╡рд╛рд▓реА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ 1M рд░рд┐рдХреЙрд░реНрдб
  • рд╣рд░ рджрд┐рди рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рднреЗрдЬрддрд╛ рд╣реИ рдкреВрд░реНрдг "рдЫрд╡рд┐"
  • рдЕрдиреБрднрд╡ рд╕реЗ рдЖрдк рд╕рдордп-рд╕рдордп рдкрд░ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ 10K рд╕реЗ рдЕрдзрд┐рдХ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдмрджрд▓реЗ рдЧрдП

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ KLADR рдЖрдзрд╛рд░ - рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдЕрдкрд▓реЛрдб рдореЗрдВ рд░рд╛рд╖реНрдЯреНрд░реАрдп рд╕реНрддрд░ рдкрд░ рднреА рдмрд╣реБрдд рдХрдо рдмрджрд▓рд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ (рдмрд╕реНрддрд┐рдпреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛, рд╕рдбрд╝рдХреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди, рдирдП рдШрд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐)ред

3.1. рдкреВрд░реНрдг рддреБрд▓реНрдпрдХрд╛рд▓рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо

рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдмрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд░реВрдк рдореЗрдВ рд▓рд╛рдПрдВ, рдпрд╛рдиреА:

  • рд╣рдЯрд╛рдирд╛ рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ рдЕрдм рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ
  • рдЕрджреНрдпрддрди рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • рд╕рдореНрдорд┐рд▓рд┐рдд рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ

рд╕рдВрдЪрд╛рд▓рди рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЯреЗрдмрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдмрдврд╝реЗрдЧрд╛ (рдПрдорд╡реАрд╕реАрд╕реА рдпрд╛рдж рд░рдЦреЗрдВ!).

рдбреАрдПрд╕рдЯреА рд╕реЗ рд╣рдЯрд╛рдПрдБ

рдирд╣реАрдВ, рдирд┐рдГрд╕рдВрджреЗрд╣ рдЖрдк рдХреЗрд╡рд▓ рджреЛ рдСрдкрд░реЗрд╢рдиреЛрдВ рд╕реЗ рдХрд╛рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рд╣рдЯрд╛рдирд╛ (DELETE) рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╕рдм рдХреБрдЫ
  • рд╕рдореНрдорд┐рд▓рд┐рдд рд╕рднреА рдирдИ рдЫрд╡рд┐ рд╕реЗ

рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдПрдорд╡реАрд╕реАрд╕реА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж, рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдареАрдХ рджреЛрдЧреБрдирд╛ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛! 1K рдЕрдкрдбреЗрдЯ рдХреЗ рдХрд╛рд░рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА +10M рдЫрд╡рд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рдЕрддрд┐рд░реЗрдХ рд╣реИ...

рдЯреНрд░рдВрдХреЗрдЯ рдбреАрдПрд╕рдЯреА

рдПрдХ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реЗ рдЯреИрдмрд▓реЗрдЯ рдХреЛ рдХрд╛рдлреА рд╕рд╕реНрддреЗ рдореЗрдВ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рд╕реНрд╡рдЪреНрдЫ (TRUNCATE) рд╕рдВрдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛
  • рд╕рдореНрдорд┐рд▓рд┐рдд рд╕рднреА рдирдИ рдЫрд╡рд┐ рд╕реЗ

рддрд░реАрдХрд╛ рдХрд╛рд░рдЧрд░ рд╣реИ, рдХрднреА-рдХрднреА рдХрд╛рдлреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ... рд╣рдо рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП 1M рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкреВрд░реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЦрд╛рд▓реА рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╣реА рд▓реЗрдирджреЗрди рдореЗрдВ рд▓рдкреЗрдЯреЗ рдмрд┐рдирд╛ рд╣реЛрдЧрд╛)ред

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:

  • рд╣рдо рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд▓реЗрди-рджреЗрди
  • TRUNCATE рд▓рдЧрд╛рддрд╛ рдПрдХреНрд╕реЗрд╕ рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡-рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛
  • рд╣рдо рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдореНрдорд┐рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдордп рдмрд╛рдХреА рд╕рднреА рд▓реЛрдЧ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ SELECT

рдХреБрдЫ рдареАрдХ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ...

рддрд╛рд▓рд┐рдХрд╛ рдмрджрд▓реЗрдВ... рдирд╛рдо рдмрджрд▓реЗрдВ... / рддрд╛рд▓рд┐рдХрд╛ рд╣рдЯрд╛рдПрдВ...

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рдЕрд▓рдЧ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рднрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдлрд┐рд░ рдкреБрд░рд╛рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПред рдХреБрдЫ рдЫреЛрдЯреА-рдЫреЛрдЯреА рдЧрдВрджреА рдмрд╛рддреЗрдВ:

  • рдЕрднреА рднреА рдПрдХреНрд╕реЗрд╕ рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХрд╛рдлреА рдХрдо рд╕рдордп
  • рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдПрдБ/рдЖрдБрдХрдбрд╝реЗ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ, ANALYZE рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • рд╕рднреА рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЯреВрдЯ рдЧрдИ рд╣реИрдВ (рдПрдлрдХреЗ) рдореЗрдЬ рдкрд░

рд╕рд╛рдЗрдорди рд░рд┐рдЧреНрд╕ рдХрд╛ рдПрдХ WIP рдкреИрдЪ рдерд╛ рдЬрд┐рд╕рдиреЗ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ ALTER-рдЖрдВрдХрдбрд╝реЛрдВ рдФрд░ рдПрдлрдХреЗ рдХреЛ рдЫреБрдП рдмрд┐рдирд╛, рдлрд╝рд╛рдЗрд▓ рд╕реНрддрд░ рдкрд░ рдЯреЗрдмрд▓ рдмреЙрдбреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрд╢рди, рд▓реЗрдХрд┐рди рдХреЛрд░рдо рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╣рдЯрд╛рдПрдБ, рдЕрджреНрдпрддрди рдХрд░реЗрдВ, рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ

рдЗрд╕рд▓рд┐рдП, рд╣рдо рддреАрди рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╡рд┐рдХрд▓реНрдк рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рд▓рдЧрднрдЧ рддреАрди... рдЗрд╕реЗ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ?

-- ╨▓╤Б╨╡ ╨┤╨╡╨╗╨░╨╡╨╝ ╨▓ ╤А╨░╨╝╨║╨░╤Е ╤В╤А╨░╨╜╨╖╨░╨║╤Ж╨╕╨╕, ╤З╤В╨╛╨▒╤Л ╨╜╨╕╨║╤В╨╛ ╨╜╨╡ ╨▓╨╕╨┤╨╡╨╗ "╨┐╤А╨╛╨╝╨╡╨╢╤Г╤В╨╛╤З╨╜╤Л╤Е" ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╣
BEGIN;

-- ╤Б╨╛╨╖╨┤╨░╨╡╨╝ ╨▓╤А╨╡╨╝╨╡╨╜╨╜╤Г╤О ╤В╨░╨▒╨╗╨╕╤Ж╤Г ╤Б ╨╕╨╝╨┐╨╛╤А╤В╨╕╤А╤Г╨╡╨╝╤Л╨╝╨╕ ╨┤╨░╨╜╨╜╤Л╨╝╨╕
CREATE TEMPORARY TABLE tmp(
  LIKE dst INCLUDING INDEXES -- ╨┐╨╛ ╨╛╨▒╤А╨░╨╖╤Г ╨╕ ╨┐╨╛╨┤╨╛╨▒╨╕╤О, ╨▓╨╝╨╡╤Б╤В╨╡ ╤Б ╨╕╨╜╨┤╨╡╨║╤Б╨░╨╝╨╕
) ON COMMIT DROP; -- ╨╖╨░ ╤А╨░╨╝╨║╨░╨╝╨╕ ╤В╤А╨░╨╜╨╖╨░╨║╤Ж╨╕╨╕ ╨╛╨╜╨░ ╨╜╨░╨╝ ╨╜╨╡ ╨╜╤Г╨╢╨╜╨░

-- ╨▒╤Л╤Б╤В╤А╨╛-╨▒╤Л╤Б╤В╤А╨╛ ╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨╜╨╛╨▓╤Л╨╣ ╨╛╨▒╤А╨░╨╖ ╤З╨╡╤А╨╡╨╖ COPY
COPY tmp FROM STDIN;
-- ...
-- .

-- ╤Г╨┤╨░╨╗╤П╨╡╨╝ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╤Г╤О╤Й╨╕╨╡
DELETE FROM
  dst D
USING
  dst X
LEFT JOIN
  tmp Y
    USING(pk1, pk2) -- ╨┐╨╛╨╗╤П ╨┐╨╡╤А╨▓╨╕╤З╨╜╨╛╨│╨╛ ╨║╨╗╤О╤З╨░
WHERE
  (D.pk1, D.pk2) = (X.pk1, X.pk2) AND
  Y IS NOT DISTINCT FROM NULL; -- "╨░╨╜╤В╨╕╨┤╨╢╨╛╨╣╨╜"

-- ╨╛╨▒╨╜╨╛╨▓╨╗╤П╨╡╨╝ ╨╛╤Б╤В╨░╨▓╤И╨╕╨╡╤Б╤П
UPDATE
  dst D
SET
  (f1, f2, f3) = (T.f1, T.f2, T.f3)
FROM
  tmp T
WHERE
  (D.pk1, D.pk2) = (T.pk1, T.pk2) AND
  (D.f1, D.f2, D.f3) IS DISTINCT FROM (T.f1, T.f2, T.f3); -- ╨╜╨╡╨╖╨░╤З╨╡╨╝ ╨╛╨▒╨╜╨╛╨▓╨╗╤П╤В╤М ╤Б╨╛╨▓╨┐╨░╨┤╨░╤О╤Й╨╕╨╡

-- ╨▓╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╤Г╤О╤Й╨╕╨╡
INSERT INTO
  dst
SELECT
  T.*
FROM
  tmp T
LEFT JOIN
  dst D
    USING(pk1, pk2)
WHERE
  D IS NOT DISTINCT FROM NULL;

COMMIT;

3.2. рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рдЖрдпрд╛рдд рдХрд░реЗрдВ

рдЙрд╕реА KLADR рдореЗрдВ, рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд, рдХреАрд╡рд░реНрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдХрдо рдХрд┐рдП рдЧрдПред рд▓реЗрдХрд┐рди рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдП рдмрд┐рдирд╛, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЫреБрдП рдмрд┐рдирд╛?

рдпрджрд┐ рдХреЗрд╡рд▓ рдЖрдкрдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рдордп рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛:

-- ╤Ж╨╡╨╗╨╡╨▓╤Л╨╡ ╤В╨░╨▒╨╗╨╕╤Ж╤Л
CREATE TABLE kladr(...);
CREATE TABLE kladr_house(...);

-- ╤В╨░╨▒╨╗╨╕╤Ж╤Л ╤Б ╨╕╤Б╤В╨╛╤А╨╕╨╡╨╣ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╣
CREATE TABLE kladr$log(
  ro kladr, -- ╤В╤Г╤В ╨╗╨╡╨╢╨░╤В ╤Ж╨╡╨╗╤Л╨╡ ╨╛╨▒╤А╨░╨╖╤Л ╨╖╨░╨┐╨╕╤Б╨╡╨╣ ╤Б╤В╨░╤А╨╛╨╣/╨╜╨╛╨▓╨╛╨╣
  rn kladr
);

CREATE TABLE kladr_house$log(
  ro kladr_house,
  rn kladr_house
);

-- ╨╛╨▒╤Й╨░╤П ╤Д╤Г╨╜╨║╤Ж╨╕╤П ╨╗╨╛╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╣
CREATE OR REPLACE FUNCTION diff$log() RETURNS trigger AS $$
DECLARE
  dst varchar = TG_TABLE_NAME || '$log';
  stmt text = '';
BEGIN
  -- ╨┐╤А╨╛╨▓╨╡╤А╤П╨╡╨╝ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛╤Б╤В╤М ╨╗╨╛╨│╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨┐╤А╨╕ ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╕ ╨╖╨░╨┐╨╕╤Б╨╕
  IF TG_OP = 'UPDATE' THEN
    IF NEW IS NOT DISTINCT FROM OLD THEN
      RETURN NEW;
    END IF;
  END IF;
  -- ╤Б╨╛╨╖╨┤╨░╨╡╨╝ ╨╖╨░╨┐╨╕╤Б╤М ╨╗╨╛╨│╨░
  stmt = 'INSERT INTO ' || dst::text || '(ro,rn)VALUES(';
  CASE TG_OP
    WHEN 'INSERT' THEN
      EXECUTE stmt || 'NULL,$1)' USING NEW;
    WHEN 'UPDATE' THEN
      EXECUTE stmt || '$1,$2)' USING OLD, NEW;
    WHEN 'DELETE' THEN
      EXECUTE stmt || '$1,NULL)' USING OLD;
  END CASE;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

рдЕрдм рд╣рдо рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯреНрд░рд┐рдЧрд░реНрд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ALTER TABLE ... ENABLE TRIGGER ...):

CREATE TRIGGER log
  AFTER INSERT OR UPDATE OR DELETE
  ON kladr
    FOR EACH ROW
      EXECUTE PROCEDURE diff$log();

CREATE TRIGGER log
  AFTER INSERT OR UPDATE OR DELETE
  ON kladr_house
    FOR EACH ROW
      EXECUTE PROCEDURE diff$log();

рдФрд░ рдлрд┐рд░ рд╣рдо рд▓реЙрдЧ рдЯреЗрдмрд▓ рд╕реЗ рд╢рд╛рдВрддрд┐рдкреВрд░реНрд╡рдХ рдЙрди рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

3.3. рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реЗрдЯ рдЖрдпрд╛рдд рдХрд░рдирд╛

рдКрдкрд░ рд╣рдордиреЗ рдЙрди рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрдм рд╕реНрд░реЛрдд рдФрд░ рдЧрдВрддрд╡реНрдп рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╕рдорд╛рди рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЕрдкрд▓реЛрдб рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднрдВрдбрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рднрд┐рдиреНрди рд╣реЛ?

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЦрд╛рддреЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рд▓реЗрдВ, рдХреНрд▓рд╛рд╕рд┐рдХ "рдореИрдиреА-рдЯреВ-рд╡рди" рд╡рд┐рдХрд▓реНрдк:

CREATE TABLE client(
  client_id
    serial
      PRIMARY KEY
, inn
    varchar
      UNIQUE
, name
    varchar
);

CREATE TABLE invoice(
  invoice_id
    serial
      PRIMARY KEY
, client_id
    integer
      REFERENCES client(client_id)
, number
    varchar
, dt
    date
, sum
    numeric(32,2)
);

рд▓реЗрдХрд┐рди рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб "рдСрд▓ рдЗрди рд╡рди" рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ:

CREATE TEMPORARY TABLE invoice_import(
  client_inn
    varchar
, client_name
    varchar
, invoice_number
    varchar
, invoice_dt
    date
, invoice_sum
    numeric(32,2)
);

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рдбреЗрдЯрд╛ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореБрдЦреНрдп рд░рд┐рдХреЙрд░реНрдб "рдЦрд╛рддрд╛" рд╣реИ:

0123456789;╨Т╨░╤Б╤П;A-01;2020-03-16;1000.00
9876543210;╨Я╨╡╤В╤П;A-02;2020-03-16;666.00
0123456789;╨Т╨░╤Б╤П;B-03;2020-03-16;9999.00

рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЕрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдбрд╛рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ - COPY рдЕрдзрд┐рдХ рдХреБрд╢рд▓!

INSERT INTO invoice_import
VALUES
  ('0123456789', '╨Т╨░╤Б╤П', 'A-01', '2020-03-16', 1000.00)
, ('9876543210', '╨Я╨╡╤В╤П', 'A-02', '2020-03-16', 666.00)
, ('0123456789', '╨Т╨░╤Б╤П', 'B-03', '2020-03-16', 9999.00);

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЙрди "рдХрдЯреМрддреА" рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реЗрдВ рдЬрд┐рдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣рдорд╛рд░реЗ "рддрдереНрдпреЛрдВ" рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд╛рд▓рд╛рди рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

CREATE TEMPORARY TABLE client_import AS
SELECT DISTINCT ON(client_inn)
-- ╨╝╨╛╨╢╨╜╨╛ ╨┐╤А╨╛╤Б╤В╨╛ SELECT DISTINCT, ╨╡╤Б╨╗╨╕ ╨┤╨░╨╜╨╜╤Л╨╡ ╨╖╨░╨▓╨╡╨┤╨╛╨╝╨╛ ╨╜╨╡╨┐╤А╨╛╤В╨╕╨▓╨╛╤А╨╡╤З╨╕╨▓╤Л
  client_inn inn
, client_name "name"
FROM
  invoice_import;

рдЦрд╛рддреЛрдВ рдХреЛ рдЧреНрд░рд╛рд╣рдХ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдвреВрдВрдврдирд╛ рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рдЙрдирдХреЗ рдЕрдВрддрд░реНрдЧрдд рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:

ALTER TABLE invoice_import ADD COLUMN client_id integer;
ALTER TABLE client_import ADD COLUMN client_id integer;

рдЖрдЗрдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рд╣рдо рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдкрдбреЗрдЯ рдпрд╛ рд╣рдЯрд╛ рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ "рдХреЗрд╡рд▓-рд╕рдВрд▓рдЧреНрди" рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:

-- ╨┐╤А╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ ╨╕╨╝╨┐╨╛╤А╤В╨░ ID ╤Г╨╢╨╡ ╤Б╤Г╤Й╨╡╤Б╤В╨▓╤Г╤О╤Й╨╕╤Е ╨╖╨░╨┐╨╕╤Б╨╡╨╣
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  client D
WHERE
  T.inn = D.inn; -- unique key

-- ╨▓╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╨╛╨▓╨░╨▓╤И╨╕╨╡ ╨╖╨░╨┐╨╕╤Б╨╕ ╨╕ ╨┐╤А╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨╕╤Е ID
WITH ins AS (
  INSERT INTO client(
    inn
  , name
  )
  SELECT
    inn
  , name
  FROM
    client_import
  WHERE
    client_id IS NULL -- ╨╡╤Б╨╗╨╕ ID ╨╜╨╡ ╨┐╤А╨╛╤Б╤В╨░╨▓╨╕╨╗╤Б╤П
  RETURNING *
)
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  ins D
WHERE
  T.inn = D.inn; -- unique key

-- ╨┐╤А╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ID ╨║╨╗╨╕╨╡╨╜╤В╨╛╨▓ ╤Г ╨╖╨░╨┐╨╕╤Б╨╡╨╣ ╤Б╤З╨╡╤В╨╛╨▓
UPDATE
  invoice_import T
SET
  client_id = D.client_id
FROM
  client_import D
WHERE
  T.client_inn = D.inn; -- ╨┐╤А╨╕╨║╨╗╨░╨┤╨╜╨╛╨╣ ╨║╨╗╤О╤З

рджрд░рдЕрд╕рд▓, рд╕рдм рдХреБрдЫ рдЕрдВрджрд░ рд╣реИ invoice_import рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдкрд░реНрдХ рдлрд╝реАрд▓реНрдб рднрд░ рдЧрдпрд╛ рд╣реИ client_id, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЪрд╛рд▓рд╛рди рдбрд╛рд▓реЗрдВрдЧреЗред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ