DBA: PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмреАрдЪ SEQUENCE рдорд╛рди рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛

рдпрджрд┐ рдореИрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рд▓реЛрдкрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ "рдмрд╕ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЕрдзрд┐рдХрддрдо (pk)" рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ "рдСрдЯреЛ-рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ" рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрдВрддрд┐рдо рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реАрдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рдкреАрдЬреА рджреВрд╕рд░реЗ рд╕рддреНрд░ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЕрдиреБрдХреНрд░рдо рдорд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг 10 рдлрд╝рдВрдХреНрд╢рди рддрдХ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



PostgreSQL рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЫрджреНрдо рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд "рдСрдЯреЛ-рдЗрдиреНрдХреНрд░реАрдореЗрдВрдЯ" рдлрд╝реАрд▓реНрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрдорд╛рд▓рд╕реЗрд░рд┐рдпрд▓, рд╕реАрд░рд┐рдпрд▓ рдФрд░ рдмрд┐рдЧрд╕реЗрд░рд┐рдпрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдХреБрдЫ рдбреАрдмреАрдПрдордПрд╕ рдореЗрдВ AUTO_INCREMENT рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рдорд╛рди) рдХреЗ рд╕рд╛рде рдХреЙрд▓рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИрдВред
рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдФрд░ SEQUENCE рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП DEFAULT рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓рд┐рдВрдХрд┐рдВрдЧ рд╣реИред рдФрд░ рдХрднреА-рдХрднреА рдореИрдВ рдЗрди рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЧреМрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ ред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ:
currval
рд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдореЗрдВ рдЗрд╕ рдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЕрдЧрд▓реА рдХреЙрд▓ рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ ред (рдпрджрд┐ рдЕрдЧрд▓реЗ рд╕рддреНрд░ рдХреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рддреНрд░ рдореЗрдВ рджрд┐рдП рдЧрдП рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХрднреА рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред) рдЪреВрдВрдХрд┐ рдпрд╣ рдорд╛рди рд╕рддреНрд░ рдХреЗ рджрд╛рдпрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдЧрд▓рд╛ рд╕рддреНрд░ рдЕрдиреНрдп рд╕рддреНрд░реЛрдВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдпрд╛ рдирд╣реАрдВред

Pg_fterences рд╕рд┐рд╕реНрдЯрдо рджреГрд╢реНрдп
PostgreSQL 10 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, pg_fterences рд╕рд┐рд╕реНрдЯрдо рджреГрд╢реНрдп рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ , рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред

рдЖрдЗрдП рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдлрд┐рд░ рднреА рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

CREATE TABLE tst( id serial --   , val integer ); INSERT INTO tst(val) VALUES(1),(2),(4),(8); 

 TABLE tst; 

 id | val -------- 1 | 1 2 | 2 3 | 4 4 | 8 

рдпрд╣ рд╡рд╣ id = 4 рдорд╛рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдиреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдпрд╣ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ:

 DELETE FROM tst WHERE id > 2; 

 id | val -------- 1 | 1 2 | 2 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдиреБрд░реВрдк рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдирд╛рдо рдкрддрд╛ рдХрд░реЗрдВрдЧреЗ:

 SELECT pg_get_serial_sequence('tst', 'id'); 

 pg_get_serial_sequence ---------------------- public.tst_id_seq 

рдЕрдм рдХреНрд╡реЗрд░реА рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдЕрдиреБрдХреНрд░рдо рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 SELECT * FROM public.tst_id_seq; 

 last_value | log_cnt | is_called -------------------------------- 4 | 29 | t 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, last_value рдлрд╝реАрд▓реНрдб рдмрд╣реБрдд "рдЕрдВрддрд┐рдо" рдорд╛рди рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдХреНрд░рдо рд╣рдорд╛рд░реЗ рдХреЙрд▓ рдХреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред

рдЕрдм рдЖрдЗрдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЕрдиреБрдХреНрд░рдо рдорд╛рди рдХреЛ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ

 --   ,    SELECT ( SELECT nlv FROM dblink( 'host=... port=5432 dbname=... user=... password=...' , $q$ SELECT setval(pg_get_serial_sequence('$q$ || quote_ident(sequence_schema) || $q$.$q$ || quote_ident(sequence_table) || $q$', '$q$ || sequence_column || $q$'), $q$ || lv || $q$) $q$ ) T(nlv bigint) --   ) nlv , * FROM ( SELECT ( SELECT relname FROM pg_class WHERE oid = (dp).refobjid ) sequence_table , ( SELECT attname FROM pg_attribute WHERE (attrelid, attnum) = ((dp).refobjid, (dp).refobjsubid) ) sequence_column , * FROM ( SELECT --    - ( SELECT lv FROM dblink( 'dbname=' || current_database() , $q$ SELECT last_value FROM $q$ || quote_ident(sequence_schema) || $q$.$q$ || quote_ident(sequence_name) || $q$ $q$ ) T(lv bigint) --   ,   ""- ) lv , ( SELECT dp FROM pg_depend dp WHERE (classid, objid, refclassid, deptype) = ('pg_class'::regclass, (quote_ident(sequence_schema) || '.' || quote_ident(sequence_name))::regclass, 'pg_class'::regclass, 'a') LIMIT 1 ) dp --      , * FROM information_schema.sequences WHERE sequence_schema IN ('public') --    ) T ) T WHERE sequence_table !~ '^_'; --      

рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрджрд┐ рд╕реНрд░реЛрдд рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдЧрд╛!

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


All Articles