рдмреИрдардХ рд╕реЗ рд╕рд╛рдордЧреНрд░реА #RuPostgres - рд╡реАрдбрд┐рдпреЛ, рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг, рдкреНрд░рд╢реНрдиреЛрддреНрддрд░реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдлреЛрдЯреЛ рд░рд┐рдкреЛрд░реНрдЯ

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



рд░рд┐рдкреЛрд░реНрдЯ


рд╡рд┐рддрд░рд┐рдд рд▓реЗрдирджреЗрди рдФрд░ рд╕рдордп рдпрд╛рддреНрд░рд╛ред Stas Kelvich, Postgres Professional


рд╕реНрдЯрд╛рд╕ рдиреЗ рд╡рд┐рддрд░рд┐рдд рд▓реЗрдирджреЗрди рдФрд░ рд╕рдордп рдпрд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред



рдкреНрд░рджрд░реНрд╢рди


рд╕рдореАрдХреНрд╖рд╛:


рд╕реНрдЯрд╛рд╕ рдФрд░ рдЙрдирдХреА рдЯреАрдо рдиреЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рдо рдХрд┐рдпрд╛! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдирд┐рд░реНрдгрдп рдХреЛ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдореЛрджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред

Avito: PostgreSQL рдкрд░ рдПрдХ рдЖрд╡реЗрджрди рд╕реНрдХреЗрд▓рд┐рдВрдЧ: рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВред рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рди рдЗрд╡рдЯреЗрд╡, рдПрд╡рд┐рдЯреЛ


рдореИрдВрдиреЗ Avito рдореЗрдВ PostgreSQL рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рджреА рдФрд░ рд╣рдорд╛рд░реЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ред



рдкреНрд░рджрд░реНрд╢рди


рд╕рдореАрдХреНрд╖рд╛:


рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг: рдЬрд┐рд╕рдореЗрдВ рдХреЛрд╕реНрдЯреЗрдВрдЯрд┐рди рдиреЗ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдврдВрдЧ рд╕реЗ рдФрд░ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╕реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдИрдкреА рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рднреА рд╕реБрдЭрд╛рдП рдЧрдП рд╣реИрдВред рдЧрд╛рдерд╛ рдпрд╛рдж рд╣реИ :)

рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдФрд░ PostgreSQL рд▓реЗрдирджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ред рдорд┐рдЦрд╛рдЗрд▓ рдЯрд╛рдпрд░рд┐рди


рдорд╛рдЗрдХрд▓ рдиреЗ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдФрд░ PostgreSQL рд▓реЗрдирджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░реЛрдВ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХреАред



рдкреНрд░рджрд░реНрд╢рди


рд╕рдореАрдХреНрд╖рд╛:


рдорд╛рдЗрдХрд▓ рдиреЗ рд▓реЗрди-рджреЗрди рдХреЗ рд╕реВрдХреНрд╖реНрдо рдХреНрд╖рдгреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛, рдЬреЛ рди рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджреВрд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

OZO C ++ 17 рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рд╢реАрд░реНрд╖рд▓реЗрдЦ-рдХреЗрд╡рд▓ PostgreSQL рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рд╕рд░реНрдЧреЗрдИ рд╣реИрдВрдбреНрд░реАрдХреЛрд╡, рдпреИрдВрдбреЗрдХреНрд╕


рд╕рд░реНрдЧреЗрдИ рдиреЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреИрд╕реЗ OZO, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЗрдбрд░-рдХреЗрд╡рд▓ PostgreSQL рдХреНрд▓рд╛рдЗрдВрдЯ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА C ++ 17 рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдкреНрд░рджрд░реНрд╢рди


рд╕рдореАрдХреНрд╖рд╛:


рд▓реЗрдЦрдХ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреБрдЫ рд╕рдордп рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдирдП C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЕрдЧрд░ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдУрдкрди рд╕реЛрд░реНрд╕ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ рдЖрдирдиреНрджрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдкреНрд░рд╢реНрдиреЛрддреНрддрд░реА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм


рдмреИрдардХ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдЖрдкрдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЖрдЬ рдореИрдВ рд╕рд╣реА рдЙрддреНрддрд░ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡реЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИрдВ (рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ)ред


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЦрд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рд╣реИ ("UserId" int, "рд╢реЗрд╖" int)ред рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрдпрд╛ рд▓реМрдЯреЗрдЧрд╛?


with ins as ( insert into users select gs, gs * 10 from generate_series(1, 4) gs where gs%2 = 0) select * from users; 

рдЬрд╡рд╛рдм рд╣реИ

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред


select * from users where UserId = 10; рдкрд┐рдЫрд▓реА рдиреМрдХрд░реА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░?


рдЬрд╡рд╛рдм рд╣реИ

рддреНрд░реБрдЯрд┐: рдХреЙрд▓рдо "рдпреВрдЬрд░рд┐рдб" рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред


Enum CREATE TYPE рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд ENUM ('рдкреНрд░рддреАрдХреНрд╖рд╛', 'init', 'run', 'stop'); рдХреМрди рд╕рд╛ рдХрдорд╛рдВрдб 'init' рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ?


рдЬрд╡рд╛рдм рд╣реИ

Enum рд╕реЗ рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдорд╛рдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред


рдореИрдВ PostgreSQL рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?


рдЬрд╡рд╛рдм рд╣реИ

рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ pg_proc;


рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрдпрд╛ рд▓реМрдЯреЗрдЧрд╛?


 select null = null, null is null, 1::smallint::boolean is true, null::bigint > 1 

рдЬрд╡рд╛рдм рд╣реИ

рддреНрд░реБрдЯрд┐: рдмреВрд▓рд┐рдпрди рдХреЛ рдЯрд╛рдЗрдк рд╕реНрдорд╛рд▓рд┐рдВрдЯ рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рдЬреВрдирд┐рдпрд░ рдбреЗрд╡рд▓рдкрд░ рд╡рд╛рд╕рд┐рдпрд╛ рдХреЛ рдПрдХ рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ parent рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рднреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП child рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╣реАрдВ рд╣реИред


рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛:


 create table parent (parent_id serial primary key, payload text); create table child (child_id serial primary key, parent_id integer unique references parent (parent_id)); 

рд╡рд╛рд╕реНрдпрд╛ рдиреЗ рдмрд╣реБрдд рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЧрдВрджрдЧреА рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рдереА, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрда рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдИ:


 -- 0 select p.parent_id, p.payload from parent p where not exists(select from child c where c.parent_id = p.parent_id); -- 1 select p.parent_id, p.payload from parent p where not (array[p.parent_id] && array(select c.parent_id from child c)); -- 2 select distinct p.parent_id, p.payload from parent p full join child c on (c.parent_id = p.parent_id) where c.parent_id is null; -- 3 select p.parent_id, p.payload from parent p where p.parent_id not in (select c.parent_id from child c); -- 4 select p.parent_id, p.payload from parent p left join child c on (c.parent_id = p.parent_id) where c.parent_id is null; -- 5 with w_child_with_parents as ( select c.parent_id, ( select count(*) from parent p where c.parent_id = p.parent_id) = 1 as parent_exists from child c) select p.parent_id, p.payload from parent p where p.parent_id in (select pc.parent_id from w_child_with_parents pc where not pc.parent_exists); -- 6 select p.parent_id, p.payload from parent p full join child c on (c.parent_id = p.parent_id) group by p.parent_id, p.payload having count(c) = 0; -- 7 select p.parent_id, p.payload from parent p where p.parent_id in ( select p2.parent_id from parent p2 except all select c2.parent_id from child c2); 

рд╡рд╛рд╕реНрдпрд╛ рдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рддрд╛рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдЪреБрдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХреЗрдВред рдЙрдирдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рд╢реНрди рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдЕрджреГрд╢реНрдп рднреА)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдиреЗ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рд╕рднреА рдЕрдиреБрд░реЛрдз рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдЬреЛ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдХреНрдпреЛрдВ рд╕рдордЭрд╛рдПрдВ)ред


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░

рдХрд╛рд░реНрдп 2, 3 рдФрд░ 5 рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, 1 рднреА рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ)ред


рдкреНрд░рдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрддрд░

рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛:


рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА "рдЧрд▓рддрддрд╛" рддрдм рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ рдЬрдм рдкреИрд░реЗрдВрдЯ_рдб рдХреЗ рд╕рд╛рде рдмрдЪреНрдЪреЗ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╢реВрдиреНрдп рд╣реЛрддреЗ рд╣реИрдВред


 insert into parent (parent_id, payload) values (1, 'payload 1'), (2, 'payload 2'), (3, 'payload 3'), (4, 'payload 4'), (5, 'payload 5'); insert into child (child_id, parent_id) values (1, 1), (2, 3), (3, null), (5, 5); 

рджрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдкрд░


  • рдХреНрд╡реЗрд░реА 1, рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯреЗрд░рд┐рдпрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
  • рдХреНрд╡реЗрд░реА 2 рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╢реВрдиреНрдп, рдЕрд╢рдХреНрдд) рджреЗрддрд╛ рд╣реИред
  • рдХреНрд╡реЗрд░реА 3 рдФрд░ 5 рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛


рдЕрдиреБрд░реЛрдз 1: рдпрджрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрдВрдЯреНрд░реИрдпрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реИ ( https://www.postgresql.org/docs/current/static/intarray.html ), рддреЛ рддреНрд░реБрдЯрд┐ "ERROR: array рдореЗрдВ рдЧрд▓рд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП" рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдорд╛рдирдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рддрддреНрд╡реЛрдВ рд╡рд╛рд▓реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╣рддрд╛ рд╣реИ:


рдСрдкрд░реЗрдЯрд░реНрд╕ &&, @> рдФрд░ <@ рд╕рдорд╛рди рдирд╛рдореЛрдВ рдХреЗ PostgreSQL рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рднреА рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рддреЗрдЬ рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдиреБрд░реЛрдз 2: рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╢реВрдиреНрдп, рдЕрд╢рдХреНрдд) рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред


рдЕрдиреБрд░реЛрдз 3: рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдЧрдард┐рдд рд╕реЗрдЯ рдореЗрдВ рд╢реВрдиреНрдп рддрддреНрд╡ рд╣реИрдВред


рдкреНрд░рд▓реЗрдЦрди ( https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-NOTIN ):


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

рдХреНрд╡реЗрд░реА 5: рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ w_child_with_parents рдЕрдиреБрднрд╛рдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдЪреНрдЪреЗ рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдЯреЗрдмрд▓ рдЦрд╛рд▓реА рд╣реИрдВ рдпрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рд╣реИрдВред


рддреАрди рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢реНрдиреЛрддреНрддрд░реА рдХреЗ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рд╣реА рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдордиреЗ рдмреИрдардХ рдореЗрдВ рдПрдХ рдкреБрд░рд╕реНрдХрд╛рд░ рджрд┐рдпрд╛, рд╕реНрдореГрддрд┐ рдЪрд┐рдиреНрд╣ рдХреЗ рджреЛ рдФрд░ рд╕реЗрдЯ рдореЗрд▓ рд╕реЗ рдЧрдПред



рдЕрдВрддрднрд╛рд╖рдг


рд╕рднрд╛ рдореЗрдВ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдЖрдП рдереЗред рдРрд╕реЗ рджрд░реНрд╢рдХреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, релреж% рд╕реЗ рдЕрдзрд┐рдХ рдореАрддрдк рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдкрд╛рдВрдЪ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЛ рджрд░реНрд╢рдХреЛрдВ рд╕реЗ рдЗрддрдиреА рдЬреАрд╡рдВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ:



рдмреИрдардХреЛрдВ рдХреЗ рдореМрдХреЗ рдкрд░, PostgreSQL рдХреЗ рдПрдХ рддреЗрдЬреА рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдХрд░рдг рдмрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдмрд╛рддреЗрдВ рд╣реБрдИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИред рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд▓реЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдПрд╡рд┐рдЯреЛ рдореЗрдВ рдбреАрдмреАрдП рдЯреАрдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдорд╣рддреНрд╡рд╛рдХрд╛рдВрдХреНрд╖реА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдорд╛рдИ рд╕рд░реНрдХрд▓ рдкрд░ рд░рд┐рдХреНрддрд┐ рджреЗрдЦреЗрдВ рдпрд╛ рдореБрдЭреЗ рд▓рд┐рдЦреЗрдВред



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


рдпрд╣рд╛рдВ рд╕рднреА рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯред
рд╣рдордиреЗ рдлреЗрд╕рдмреБрдХ рдФрд░ VKontakte рдкрд░ рдлреЛрдЯреЛ рд░рд┐рдкреЛрд░реНрдЯ рдкреЛрд╕реНрдЯ рдХреАред



рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВ!

Source: https://habr.com/ru/post/hi424249/


All Articles