{"id":320171,"date":"2021-03-24T15:00:28","date_gmt":"2021-03-24T15:00:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320171"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320171","title":{"rendered":"DBA: \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0447\u0442\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f serial"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p><em>&#171;\u0428\u0435\u0444, \u0432\u0441\u0451 \u043f\u0440\u043e\u043f\u0430\u043b\u043e, \u0443 \u043d\u0430\u0441 <\/em><code>serial<\/code><em> \u043d\u0430 \u043c\u0435\u0433\u0430\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e\u0447\u0442\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f!&#187; &#8212; <\/em>\u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043b\u0438\u0431\u043e \u0432\u044b \u0435\u0433\u043e <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/507688\/\">\u043d\u0435\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438<\/a> \u0441\u0430\u043c\u0438, \u043b\u0438\u0431\u043e \u0443 \u0432\u0430\u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e <strong>\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 <\/strong><code>integer<\/code><strong>-\u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442<\/strong> \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 PostgreSQL-\u0431\u0430\u0437\u0435.<\/p>\n<p>\u0414\u0430 \u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u044d\u0442\u043e\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0430 \u0446\u0435\u043b\u044b\u0439 <code>PRIMARY KEY<\/code>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0435 \u0438 \u0440\u044f\u0434 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u043e <code>FOREIGN KEY<\/code> \u0437\u0430\u0432\u044f\u0437\u0430\u043d. \u0410 \u0435\u0449\u0435 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0438\u0431\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c 24&#215;7 \u043e\u0431\u0435\u0449\u0430\u043d\u043e&#8230;<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e <strong>\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 PK-\u043f\u043e\u043b\u044f<\/strong> \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41d\/0b1\/847\/41d0b184726c9fd70d737c9f24163b63.jpeg\" width=\"1184\" height=\"789\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d:<\/p>\n<pre><code class=\"sql\">CREATE TABLE tblpk(   pk     serial       PRIMARY KEY , valx     integer ); INSERT INTO tblpk(valx) SELECT generate_series(1, 1e6);  CREATE TABLE tblfk(   fk     integer       REFERENCES tblpk , valy     integer ); INSERT INTO tblfk(fk, valy) SELECT (random() * (1e6 - 1))::integer + 1, generate_series(1, 1e6); -- \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f FK \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \"\u0432\u0440\u0443\u0447\u043d\u0443\u044e\" CREATE INDEX ON tblfk(fk);<\/code><\/pre>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435:<\/p>\n<pre><code class=\"sql\">ALTER TABLE tblpk ADD COLUMN _pk bigint; ALTER TABLE tblfk ADD COLUMN _fk bigint;<\/code><\/pre>\n<h4>\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0439 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0440\u0430\u0437\u0431\u0435\u0433\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u0432\u0435\u0441\u0438\u043c \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 &#8212; \u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u044f:<code>BEFORE INSERT OR UPDATE OF &lt;PK-\u043f\u043e\u043b\u0435&gt;<\/code>.<\/p>\n<p>\u0420\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>tblfk<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e SQL-\u043c\u0430\u0433\u0438\u0438:<\/p>\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION copy_fld() RETURNS trigger AS $$ DECLARE   fld_src text := quote_ident(TG_ARGV[0]); -- \u0438\u043c\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f   fld_dst text := quote_ident(TG_ARGV[1]); -- \u0438\u043c\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f BEGIN   EXECUTE $q$                 -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442     SELECT       (         json_populate_record( -- \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 JSON           $1                  -- NEW         , json_build_object(  -- {[fld_dst] : NEW[fld_src]}::json             '$q$ || fld_dst || $q$'           , $1.$q$ || fld_src || $q$::text           )         )       ).*                     -- \"\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\" record \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c     $q$     USING NEW -- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c NEW \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 $1-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430     INTO NEW; -- \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 NEW   RETURN NEW; -- \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c NEW, \u0438\u043d\u0430\u0447\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u0441\u044f END $$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 &#8212; \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446:<\/p>\n<pre><code class=\"sql\">CREATE TRIGGER copy BEFORE INSERT OR UPDATE OF pk    ON tblpk    FOR EACH ROW    EXECUTE PROCEDURE copy_fld('pk', '_pk'); -- \u043e\u0442\u043a\u0443\u0434\u0430\/\u043a\u0443\u0434\u0430  CREATE TRIGGER copy BEFORE INSERT OR UPDATE OF fk    ON tblfk    FOR EACH ROW    EXECUTE PROCEDURE copy_fld('fk', '_fk');<\/code><\/pre>\n<h4>\u041c\u0430\u0441\u0441\u043e\u0432\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">UPDATE tblpk SET _pk = pk WHERE _pk IS NULL; UPDATE tblfk SET _fk = fk WHERE _fk IS NULL;<\/code><\/pre>\n<p>\u041e\u043d \u0436\u0435 &#8212; \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0432\u043b\u0435\u0447\u0435\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 <strong>\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a<\/strong> \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0436\u0435 \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u044d\u0442\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445.<\/p>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <strong>\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c<\/strong>, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/481610\/\">&#171;PostgreSQL Antipatterns: \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439&#187;<\/a>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0435\u0434\u0438\u043d\u044b\u0439 <code>UPDATE<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0438\u044e \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0441\u0430\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430:<\/p>\n<pre><code class=\"sql\">UPDATE   tblpk SET   _pk = pk WHERE   pk BETWEEN $1 AND $1 + 999 AND -- \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e 1K   _pk IS NULL;<\/code><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441<\/h4>\n<p>\u0412 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430:<\/p>\n<pre><code class=\"sql\">CREATE UNIQUE INDEX CONCURRENTLY _pk ON tblpk(_pk); -- \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0439 PK CREATE INDEX CONCURRENTLY _fk ON tblfk(_fk);        -- \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0439 FK<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 <code>UPDATE<\/code> \u043f\u0438\u0441\u0430\u043b\u0438 \u0431\u044b \u0435\u0449\u0435 \u0438 \u0432 \u043d\u0435\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e\u043b\u044c\u0448\u0435.<\/p>\n<h2>\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f* \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0439\u043c\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 autovacuum\/autoanalyze<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/p>\n<p>\u042d\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u044f\u0442\u0441\u044f \u0441 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b <code>UPDATE<\/code>&#8216;\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0441\u043d\u0438\u043c\u0435\u043c \u0438\u0445 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 <code>ALTER TABLE<\/code> \u0431\u0443\u0434\u0443\u0442 \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0430\u043c\u0438 (<code>Access Exclusive<\/code>), \u0430 \u0437\u0430 \u043d\u0438\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043f\u0438\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0434\u0430\u0436\u0435 <code>SELECT<\/code> (<code>Access Share<\/code>) \u043f\u043e \u044d\u0442\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/strong> \u0432 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435<\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u0441\u0442\u044b\u0440\u043d\u044b\u0439 <code>SELECT<\/code> \u0438\u0437 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0448\u0438\u043c\u0438 <code>ALTER TABLE<\/code>, \u0447\u0442\u043e \u043e\u043f\u044f\u0442\u044c-\u0442\u0430\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c.<\/p>\n<p>\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 <code>NOWAIT<\/code>-\u0440\u0435\u0436\u0438\u043c\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e <code>SELECT<\/code>-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0438\u0445-\u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043d\u0438\u043c\u0430\u043b\u0438) \u043f\u043e \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0435 \u0432\u0438\u0441\u0435\u0442\u044c \u0438 \u0436\u0434\u0430\u0442\u044c \u0435\u0433\u043e, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u043e\u0442\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0435 \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0431\u0446\u0443 (<code>OWNED BY<\/code>) \u0438 \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (<code>NO MAXVALUE<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<ul>\n<li>\n<p><strong>\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446<\/strong> \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442 \u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 copy-\u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0438 \u0432\u0441\u0435 \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0438\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 <\/strong>\u0432 \u0441\u0442\u0430\u0440\u044b\u0439<\/p>\n<\/li>\n<li>\n<p><strong>\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c DEFAULT<\/strong> \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0434\u0432\u043e\u0439\u043d\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><strong>\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447<\/strong> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0447\u0442\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0447\u0443\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ul>\n<li>\n<p>\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u044b<\/p>\n<\/li>\n<li>\n<p><strong>\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447<\/strong> \u0432 <code>NOT VALID<\/code>-\u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p><strong>\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/strong> \u043f\u043e\u0434 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre><code class=\"sql\">BEGIN;   -- \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b autovacuum\/autoanalyze \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c   SELECT     pg_terminate_backend(pid)   FROM     pg_stat_activity sa   WHERE     CASE       WHEN backend_type = 'autovacuum worker' THEN         EXISTS(           SELECT             NULL           FROM             pg_locks           WHERE             locktype = 'relation' AND             relation = ANY(ARRAY['tblpk', 'tblfk']::regclass[])         )     END;    -- \u0441\u0440\u0430\u0437\u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u043b\u0435\u0437   LOCK TABLE tblpk, tblfk IN ACCESS EXCLUSIVE MODE NOWAIT;    -- sequence   ALTER SEQUENCE tblpk_pk_seq OWNED BY tblpk._pk;   ALTER SEQUENCE tblpk_pk_seq NO MAXVALUE;    -- tblpk   ALTER TABLE tblpk     DROP COLUMN pk CASCADE; -- \u0441\u043d\u043e\u0441\u0438\u0442 \u0437\u0430\u043e\u0434\u043d\u043e copy-\u0442\u0440\u0438\u0433\u0433\u0435\u0440, PK \u0438 \u0432\u0441\u0435 FK   ALTER TABLE tblpk     RENAME COLUMN _pk TO pk;   ALTER TABLE tblpk     ALTER COLUMN pk SET DEFAULT nextval('tblpk_pk_seq');   ALTER TABLE tblpk     ADD CONSTRAINT tblpk_pkey PRIMARY KEY USING INDEX _pk;    -- tblfk   ALTER TABLE tblfk     DROP COLUMN fk CASCADE;   ALTER TABLE tblfk     RENAME COLUMN _fk TO fk;   ALTER TABLE tblfk     ADD CONSTRAINT tblfk_fk_fkey       FOREIGN KEY(fk)       REFERENCES tblpk       NOT VALID; -- \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c   ALTER INDEX _fk RENAME TO tblfk_fk_fkey; COMMIT;<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0435\u0434\u0438\u043d\u044b\u043c \u043a\u0443\u0441\u043a\u043e\u043c \u043f\u043e\u0434 \u043e\u0431\u0449\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, <strong>\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u0438 DDL \u0432 PostgreSQL<\/strong>, \u043b\u0438\u0431\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043b\u0438\u0431\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0436\u0435 &#8212; \u043d\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u0435\u0441\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0441 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c &#171;\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438&#187;, \u0445\u043e\u0442\u044f \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b. \u0416\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043d\u0438\u043a\u0430\u043a, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c FK \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u0430\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0430 <code>ExclusiveLock<\/code>, \u0447\u0442\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 <strong>\u0434\u0430\u0436\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/strong>, \u043f\u043e\u043a\u0430 \u0432\u0441\u044f \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">ALTER TABLE tblfk   VALIDATE CONSTRAINT tblfk_fk_fkey;<\/code><\/pre>\n<h2>\u0427\u0442\u043e \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438?<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/p>\n<h4>\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h4>\n<p>\u0412 \u0431\u0430\u0437\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430 \u043a\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043d\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c, <strong>\u043a\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0435<\/strong>. \u0427\u0442\u043e\u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0445 \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u0447\u044c\u0438 \u0438\u043c\u0435\u043d\u0430 \u043c\u044b \u043d\u0438\u0433\u0434\u0435 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438, \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438, \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u043c:<\/p>\n<ul>\n<li>\n<p><code>tblpk_pkey<\/code> &#8212; \u0438\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430<\/p>\n<\/li>\n<li>\n<p><code>tblfk_fk_fkey<\/code> &#8212; \u0438\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430<\/p>\n<\/li>\n<li>\n<p><code>tblpk_pk_seq<\/code> &#8212; \u0438\u043c\u044f serial-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438\u0445 \u0438\u043c\u0435\u043d\u0430 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0430\u043c\u0438\u043c PostgreSQL, \u0442\u0430\u043a \u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430\u043c\u0438 \u0431\u0430\u0437\u044b &#8212; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c\u0438, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c.<\/p>\n<h4>\u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b<\/h4>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043c\u044b \u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0438 \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0443 \u043d\u0430\u0441 \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u0438\u0437 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439. \u041d\u043e FK-\u0438\u043d\u0434\u0435\u043a\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434 <code>tblfk(fk) WHERE fk IS NOT NULL<\/code>, \u0447\u0442\u043e\u0431\u044b <code>NULL<\/code>-\u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0437\u0430\u043c\u0443\u0441\u043e\u0440\u0438\u0432\u0430\u043b\u0438 \u0435\u0433\u043e, \u0430 PK \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u044f, \u043a\u0440\u043e\u043c\u0435 <code>serial<\/code>.<\/p>\n<h4>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439<\/h4>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u0447\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 &#8212; \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>MATCH PARTIAL INITIALLY DEFERRED<\/code> \u0438\u043b\u0438 <code>ON DELETE SET NULL ON UPDATE RESTRICT<\/code>.<\/p>\n<h4>\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044b<\/h4>\n<p>\u0423\u0434\u0430\u043b\u0438\u0432 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043c\u044b \u0441\u043d\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0436\u0435 \u0438 copy-\u0442\u0440\u0438\u0433\u0433\u0435\u0440. \u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u043d\u0435 \u043e\u0434\u0438\u043d \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0435?..<\/p>\n<h4>\u0418\u043c\u0435\u043d\u0430 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438<\/h4>\n<p>\u0418\u043c\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043c\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438 &#171;\u043f\u043e \u043d\u0430\u0438\u0442\u0438\u044e&#187;, \u043d\u043e \u043d\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u043e\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c FK-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0410 \u0435\u0449\u0435 \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 <code>COMMENT ON<\/code>.<\/p>\n<h2>\u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h2>\n<p>\u041f\u043e \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u044f\u0437\u0438 \u043d\u0430\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>sequence \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0435 \u0447\u0435\u0440\u0435\u0437 <code>OWNED BY<\/code>, \u0430 \u043e\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>DEFAULT<\/code><\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/p>\n<\/li>\n<li>\n<p>FK-constraint \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044f \u043f\u0430\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u0432\u0435\u0434\u0443\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/432\/db6\/1b5\/432db61b5a6e7d70554683a3161ae03e.png\" width=\"719\" height=\"266\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u0443\u044e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e &#8212; \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0438 &#171;\u0445\u0438\u0442\u0440\u044b\u0435&#187; \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 FK:<\/p>\n<pre><code class=\"sql\">CREATE TABLE \"1st table\"(   \"primary key col\"     serial       PRIMARY KEY , valx     integer ); COMMENT ON COLUMN \"1st table\".\"primary key col\"   IS 'col-comment'; INSERT INTO \"1st table\"(valx) SELECT generate_series(1, 1e5);  CREATE TABLE \"2nd table\"(   fk     integer       CONSTRAINT \"FK-name\" REFERENCES \"1st table\"         ON UPDATE SET NULL         ON DELETE RESTRICT , valy     integer ); COMMENT ON CONSTRAINT \"FK-name\" ON \"2nd table\"   IS 'con-comment'; INSERT INTO \"2nd table\"(fk, valy) SELECT (random() * (1e5 - 1))::integer + 1, generate_series(1, 1e5);  CREATE INDEX \"FK-idx-name\" ON \"2nd table\"(fk); COMMENT ON INDEX \"FK-idx-name\"   IS 'idx-comment';  CREATE OR REPLACE FUNCTION tmp() RETURNS trigger AS $$ BEGIN   RAISE NOTICE 'NEW : %', NEW::text; END $$ LANGUAGE plpgsql;  CREATE TRIGGER tmp AFTER INSERT OR UPDATE OF \"primary key col\"   ON \"1st table\"   FOR EACH ROW   EXECUTE PROCEDURE tmp();  COMMENT ON TRIGGER tmp ON \"1st table\"   IS 'trg-comment';<\/code><\/pre>\n<p>\u041d\u0443, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u043e \u0437\u0430 \u043c\u0430\u043b\u044b\u043c! \u0412\u043e\u0442 \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f serial -&gt; bigserial<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">-- $1 : '\"1st table\"'     - \u0441 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u043c\u0438! -- $2 : 'primary key col' - \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a! WITH src(rel, fld) AS (   VALUES($1::regclass, $2::name) ) , fld AS (   SELECT     *   FROM     src   JOIN     pg_attribute at       ON (at.attrelid, at.attname) = (src.rel, src.fld) ) , idx AS (   SELECT     idx.*   FROM     fld   JOIN     pg_index idx       ON indrelid = attrelid AND       indkey::smallint[] &amp;&amp; ARRAY[attnum] ) , con AS (   SELECT     CASE contype       WHEN 'p' THEN attnum       WHEN 'f' THEN conkey[array_position(confkey, attnum)]     END idkey   , con.*   FROM     fld   JOIN     pg_constraint con       ON (conrelid = attrelid AND conkey &amp;&amp; ARRAY[attnum]) OR       (confrelid = attrelid AND confkey &amp;&amp; ARRAY[attnum]) ) -- \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 PK \u0438\u043b\u0438 FK , colkey AS (   SELECT     *   , attrelid::regclass::text _attrel   , '_' || md5(attname) _attname   , quote_ident(attname) _qiattname   , replace(col_description(attrelid, attnum), '''', '''''') dsccol   FROM     con   INNER JOIN     pg_attribute at       ON (attrelid, attnum) = (conrelid, idkey)   WHERE     atttypid &lt;&gt; 'bigint'::regtype ) , code_col AS (   SELECT     string_agg( $$-- $$ || _attrel || $$ ALTER TABLE $$ || _attrel || $$   ADD COLUMN $$ || _attname || $$ bigint; $$ ||       CASE         WHEN dsccol IS NOT NULL THEN $$COMMENT ON COLUMN $$ || _attrel || '.' || _attname || $$   IS '$$ || dsccol || $$'; $$         ELSE ''       END ||  $$CREATE TRIGGER copy   BEFORE INSERT OR UPDATE OF $$ || _qiattname || $$     ON $$ || _attrel || $$     FOR EACH ROW     EXECUTE PROCEDURE copy_fld('$$ || attname || $$', '$$ || _attname || $$'); UPDATE $$ || _attrel || $$ SET $$ || _attname || $$ = $$ || _qiattname || $$ WHERE $$ || _attname || $$ IS NULL; -- \u043b\u0443\u0447\u0448\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u043e!!! $$     , ''     ) code   FROM     colkey ) -- \u0438\u043d\u0434\u0435\u043a\u0441\u044b , indkey AS (   SELECT     *   , quote_ident('_' || md5(sch || '.' || rel || '.' || idxname)) _idxname   FROM     (       SELECT         pg_get_indexdef(indexrelid) def       , cli.relnamespace::regnamespace::text sch       , idx.indrelid::regclass::text rel       , quote_ident(cli.relname) idxname       , replace(obj_description(cli.oid, 'pg_class'), '''', '''''') dscidx       , *       FROM         colkey       JOIN         pg_index idx           ON indrelid = attrelid AND           indkey::smallint[] &amp;&amp; ARRAY[attnum]       JOIN         pg_class cli           ON cli.oid = idx.indexrelid     ) T ) , code_idx AS (   SELECT     string_agg(       E'-- ' || idxname || E'\\n' ||       regexp_replace(         regexp_replace(           def         , E'(CREATE(?: UNIQUE)? INDEX ).*?( ON ).*?( USING )'         , E'\\\\1CONCURRENTLY ' || _idxname || E'\\n  ON ' || sch || '.' || rel || E'\\n  USING '         )       , E'(USING \\\\S+ \\\\(.*)' || _qiattname || E'(.*\\\\))'       , E'\\\\1' || _attname || E'\\\\2'       , 'g'       ) || E';\\n'       || CASE         WHEN dscidx IS NOT NULL THEN $$COMMENT ON INDEX $$ || _idxname || $$   IS '$$ || dscidx || $$'; $$         ELSE ''       END     , ''     ) code   FROM     indkey ) -- \u0442\u0444\u0431\u043b\u0438\u0446\u044b , code_rel AS (   SELECT     $q$-- \u0437\u0430\u0447\u0438\u0449\u0430\u0435\u043c \u043c\u0435\u0448\u0430\u044e\u0449\u0438\u0435 autovacuum SELECT   pg_terminate_backend(pid) FROM   pg_stat_activity sa WHERE   CASE     WHEN backend_type = 'autovacuum worker' THEN       EXISTS(         SELECT           NULL         FROM           pg_locks         WHERE           locktype = 'relation' AND           relation = ANY('$q$ || array_agg(rel)::text || $q$'::regclass[])       )     END; -- \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b LOCK TABLE $q$ || string_agg(rel, ', ') || $q$ IN ACCESS EXCLUSIVE MODE NOWAIT; $q$ code   FROM     (       SELECT DISTINCT         _attrel rel       FROM         colkey     ) T ) -- \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c , seqkey AS (   SELECT     pg_get_serial_sequence(attrelid::regclass::text, attname) seq   , *   FROM     colkey ) , code_seq AS (   SELECT $q$ALTER SEQUENCE $q$ || seq || $q$   OWNED BY $q$ || _attrel || '.' || _attname || $q$; ALTER SEQUENCE $q$ || seq || $q$   NO MAXVALUE; $q$   FROM     seqkey   WHERE     seq IS NOT NULL ) -- \u0441\u0442\u043e\u043b\u0431\u0446\u044b , code_col_tx AS (   SELECT     string_agg( $$-- $$ || _attrel || $$ ALTER TABLE $$ || _attrel || $$   DROP COLUMN $$ || _qiattname || $$ CASCADE; ALTER TABLE $$ || _attrel || $$   RENAME COLUMN $$ || _attname || $$ TO $$ || _qiattname || $$; $$ ||       CASE         WHEN adsrc IS NOT NULL THEN $$ALTER TABLE $$ || _attrel || $$   ALTER COLUMN $$ || _qiattname || $$     SET DEFAULT $$ || adsrc || $$; $$         ELSE ''       END     ,   ''     ) code   FROM     colkey   LEFT JOIN     pg_attrdef ad       ON (adrelid, adnum) = (attrelid, attnum) ) -- \u0438\u043d\u0434\u0435\u043a\u0441\u044b , code_idx_tx AS (   SELECT     string_agg( $$ALTER INDEX $$ || _idxname || $$   RENAME TO $$ || idxname || $$; $$     , '')   FROM     indkey ) -- \u043a\u043b\u044e\u0447\u0438 , code_con_tx AS (   SELECT     string_agg(     (       SELECT         string_agg(           'ALTER TABLE ' || conrelid::regclass::text || E'\\n  ADD ' ||           CASE con.contype             WHEN 'p' THEN               'PRIMARY KEY USING INDEX ' || idxname             WHEN 'u' THEN               'UNIQUE USING INDEX ' || idxname             WHEN 'f' THEN               'CONSTRAINT ' || quote_ident(con.conname) || ' ' || pg_get_constraintdef(con.oid) || CASE WHEN pg_get_constraintdef(con.oid) !~* 'NOT VALID' THEN E'\\n    NOT VALID' ELSE '' END           END || E';\\n' ||           CASE             WHEN obj_description(con.oid, 'pg_constraint') IS NOT NULL THEN $$COMMENT ON CONSTRAINT $$ || quote_ident(conname) || $$ ON $$ || conrelid::regclass::text || $$   IS '$$ || replace(obj_description(con.oid, 'pg_constraint'), '''', '''''') || $$'; $$             ELSE ''           END         , ''         ORDER BY           CASE con.contype             WHEN 'p' THEN 0             WHEN 'u' THEN 1             WHEN 'f' THEN 2           END         )       FROM         pg_constraint con       WHERE         conindid = indexrelid     )     , ''     ) code   FROM     indkey ) -- \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b , trgkey AS (   SELECT     pg_get_triggerdef(trg.oid) def   , replace(obj_description(trg.oid, 'pg_trigger'), '''', '''''') dsctrg   , *   FROM     colkey   JOIN     pg_trigger trg       ON tgrelid = attrelid AND       tgattr::smallint[] &amp;&amp; ARRAY[attnum]   WHERE     NOT tgisinternal ) , code_trg AS (   SELECT     string_agg(       def || E';\\n'       || CASE         WHEN dsctrg IS NOT NULL THEN $$COMMENT ON TRIGGER $$ || quote_ident(tgname) || $$ ON $$ || _attrel || $$   IS '$$ || dsctrg || $$'; $$         ELSE ''       END     , ''     ) code   FROM     trgkey ) SELECT   E'-- \u0441\u0442\u043e\u043b\u0431\u0446\u044b\\n' ||   (TABLE code_col) ||   E'\\n-- \u0438\u043d\u0434\u0435\u043a\u0441\u044b\\n' ||   (TABLE code_idx) ||   E'\\nBEGIN;\\n' ||   regexp_replace(     (TABLE code_rel) ||     E'\\n-- \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\\n' ||     (TABLE code_seq) ||     E'\\n-- \u0441\u0442\u043e\u043b\u0431\u0446\u044b\\n' ||     (TABLE code_col_tx) ||     E'\\n-- \u0438\u043d\u0434\u0435\u043a\u0441\u044b\\n' ||     (TABLE code_idx_tx) ||     E'\\n-- \u043a\u043b\u044e\u0447\u0438\\n' ||     (TABLE code_con_tx) ||     E'\\n-- \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b\\n' ||     (TABLE code_trg)   , E'^(.)'   , E'  \\\\1'   , 'gm'   ) ||   E'COMMIT;\\n';<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u0432\u0430\u043c.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/547740\/\"> https:\/\/habr.com\/ru\/company\/tensor\/blog\/547740\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p><em>&#171;\u0428\u0435\u0444, \u0432\u0441\u0451 \u043f\u0440\u043e\u043f\u0430\u043b\u043e, \u0443 \u043d\u0430\u0441 <\/em><code>serial<\/code><em> \u043d\u0430 \u043c\u0435\u0433\u0430\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e\u0447\u0442\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f!&#187; &#8212; <\/em>\u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043b\u0438\u0431\u043e \u0432\u044b \u0435\u0433\u043e <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/507688\/\">\u043d\u0435\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438<\/a> \u0441\u0430\u043c\u0438, \u043b\u0438\u0431\u043e \u0443 \u0432\u0430\u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e <strong>\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 <\/strong><code>integer<\/code><strong>-\u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442<\/strong> \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 PostgreSQL-\u0431\u0430\u0437\u0435.<\/p>\n<p>\u0414\u0430 \u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u044d\u0442\u043e\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0430 \u0446\u0435\u043b\u044b\u0439 <code>PRIMARY KEY<\/code>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0435 \u0438 \u0440\u044f\u0434 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u043e <code>FOREIGN KEY<\/code> \u0437\u0430\u0432\u044f\u0437\u0430\u043d. \u0410 \u0435\u0449\u0435 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0438\u0431\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c 24&#215;7 \u043e\u0431\u0435\u0449\u0430\u043d\u043e&#8230;<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e <strong>\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 PK-\u043f\u043e\u043b\u044f<\/strong> \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043e.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d:<\/p>\n<pre><code class=\"sql\">CREATE TABLE tblpk(   pk     serial       PRIMARY KEY , valx     integer ); INSERT INTO tblpk(valx) SELECT generate_series(1, 1e6);  CREATE TABLE tblfk(   fk     integer       REFERENCES tblpk , valy     integer ); INSERT INTO tblfk(fk, valy) SELECT (random() * (1e6 - 1))::integer + 1, generate_series(1, 1e6); -- \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f FK \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \"\u0432\u0440\u0443\u0447\u043d\u0443\u044e\" CREATE INDEX ON tblfk(fk);<\/code><\/pre>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435:<\/p>\n<pre><code class=\"sql\">ALTER TABLE tblpk ADD COLUMN _pk bigint; ALTER TABLE tblfk ADD COLUMN _fk bigint;<\/code><\/pre>\n<h4>\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0439 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0440\u0430\u0437\u0431\u0435\u0433\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u0432\u0435\u0441\u0438\u043c \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 &#8212; \u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u044f:<code>BEFORE INSERT OR UPDATE OF &lt;PK-\u043f\u043e\u043b\u0435&gt;<\/code>.<\/p>\n<p>\u0420\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>tblfk<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e SQL-\u043c\u0430\u0433\u0438\u0438:<\/p>\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION copy_fld() RETURNS trigger AS $$ DECLARE   fld_src text := quote_ident(TG_ARGV[0]); -- \u0438\u043c\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f   fld_dst text := quote_ident(TG_ARGV[1]); -- \u0438\u043c\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f BEGIN   EXECUTE $q$                 -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442     SELECT       (         json_populate_record( -- \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 JSON           $1                  -- NEW         , json_build_object(  -- {[fld_dst] : NEW[fld_src]}::json             '$q$ || fld_dst || $q$'           , $1.$q$ || fld_src || $q$::text           )         )       ).*                     -- \"\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\" record \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c     $q$     USING NEW -- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c NEW \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 $1-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430     INTO NEW; -- \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 NEW   RETURN NEW; -- \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c NEW, \u0438\u043d\u0430\u0447\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u0441\u044f END $$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 &#8212; \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446:<\/p>\n<pre><code class=\"sql\">CREATE TRIGGER copy BEFORE INSERT OR UPDATE OF pk    ON tblpk    FOR EACH ROW    EXECUTE PROCEDURE copy_fld('pk', '_pk'); -- \u043e\u0442\u043a\u0443\u0434\u0430\/\u043a\u0443\u0434\u0430  CREATE TRIGGER copy BEFORE INSERT OR UPDATE OF fk    ON tblfk    FOR EACH ROW    EXECUTE PROCEDURE copy_fld('fk', '_fk');<\/code><\/pre>\n<h4>\u041c\u0430\u0441\u0441\u043e\u0432\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">UPDATE tblpk SET _pk = pk WHERE _pk IS NULL; UPDATE tblfk SET _fk = fk WHERE _fk IS NULL;<\/code><\/pre>\n<p>\u041e\u043d \u0436\u0435 &#8212; \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0432\u043b\u0435\u0447\u0435\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 <strong>\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a<\/strong> \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0436\u0435 \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u044d\u0442\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445.<\/p>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <strong>\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c<\/strong>, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/481610\/\">&#171;PostgreSQL Antipatterns: \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439&#187;<\/a>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0435\u0434\u0438\u043d\u044b\u0439 <code>UPDATE<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0438\u044e \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0441\u0430\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430:<\/p>\n<pre><code class=\"sql\">UPDATE   tblpk SET   _pk = pk WHERE   pk BETWEEN $1 AND $1 + 999 AND -- \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e 1K   _pk IS NULL;<\/code><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441<\/h4>\n<p>\u0412 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430:<\/p>\n<pre><code class=\"sql\">CREATE UNIQUE INDEX CONCURRENTLY _pk ON tblpk(_pk); -- \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0439 PK CREATE INDEX CONCURRENTLY _fk ON tblfk(_fk);        -- \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0439 FK<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 <code>UPDATE<\/code> \u043f\u0438\u0441\u0430\u043b\u0438 \u0431\u044b \u0435\u0449\u0435 \u0438 \u0432 \u043d\u0435\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e\u043b\u044c\u0448\u0435.<\/p>\n<h2>\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f* \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0439\u043c\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 autovacuum\/autoanalyze<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/p>\n<p>\u042d\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u044f\u0442\u0441\u044f \u0441 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b <code>UPDATE<\/code>&#8216;\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0441\u043d\u0438\u043c\u0435\u043c \u0438\u0445 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 <code>ALTER TABLE<\/code> \u0431\u0443\u0434\u0443\u0442 \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0430\u043c\u0438 (<code>Access Exclusive<\/code>), \u0430 \u0437\u0430 \u043d\u0438\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043f\u0438\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0434\u0430\u0436\u0435 <code>SELECT<\/code> (<code>Access Share<\/code>) \u043f\u043e \u044d\u0442\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/strong> \u0432 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435<\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u0441\u0442\u044b\u0440\u043d\u044b\u0439 <code>SELECT<\/code> \u0438\u0437 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0448\u0438\u043c\u0438 <code>ALTER TABLE<\/code>, \u0447\u0442\u043e \u043e\u043f\u044f\u0442\u044c-\u0442\u0430\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c.<\/p>\n<p>\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 <code>NOWAIT<\/code>-\u0440\u0435\u0436\u0438\u043c\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e <code>SELECT<\/code>-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0438\u0445-\u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043d\u0438\u043c\u0430\u043b\u0438) \u043f\u043e \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0435 \u0432\u0438\u0441\u0435\u0442\u044c \u0438 \u0436\u0434\u0430\u0442\u044c \u0435\u0433\u043e, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u043e\u0442\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0435 \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0431\u0446\u0443 (<code>OWNED BY<\/code>) \u0438 \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (<code>NO MAXVALUE<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<ul>\n<li>\n<p><strong>\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446<\/strong> \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442 \u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 copy-\u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0438 \u0432\u0441\u0435 \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0438\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 <\/strong>\u0432 \u0441\u0442\u0430\u0440\u044b\u0439<\/p>\n<\/li>\n<li>\n<p><strong>\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c DEFAULT<\/strong> \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0434\u0432\u043e\u0439\u043d\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><strong>\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447<\/strong> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0447\u0442\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0447\u0443\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ul>\n<li>\n<p>\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u044b<\/p>\n<\/li>\n<li>\n<p><strong>\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447<\/strong> \u0432 <code>NOT VALID<\/code>-\u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p><strong>\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/strong> \u043f\u043e\u0434 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre><code class=\"sql\">BEGIN;   -- \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b autovacuum\/autoanalyze \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c   SELECT     pg_terminate_backend(pid)   FROM     pg_stat_activity sa   WHERE     CASE       WHEN backend_type = 'autovacuum worker' THEN         EXISTS(           SELECT             NULL           FROM             pg_locks           WHERE             locktype = 'relation' AND             relation = ANY(ARRAY['tblpk', 'tblfk']::regclass[])         )     END;    -- \u0441\u0440\u0430\u0437\u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u043b\u0435\u0437   LOCK TABLE tblpk, tblfk IN ACCESS EXCLUSIVE MODE NOWAIT;    -- sequence   ALTER SEQUENCE tblpk_pk_seq OWNED BY tblpk._pk;   ALTER SEQUENCE tblpk_pk_seq NO MAXVALUE;    -- tblpk   ALTER TABLE tblpk     DROP COLUMN pk CASCADE; -- \u0441\u043d\u043e\u0441\u0438\u0442 \u0437\u0430\u043e\u0434\u043d\u043e copy-\u0442\u0440\u0438\u0433\u0433\u0435\u0440, PK \u0438 \u0432\u0441\u0435 FK   ALTER TABLE tblpk     RENAME COLUMN _pk TO pk;   ALTER TABLE tblpk     ALTER COLUMN pk SET DEFAULT nextval('tblpk_pk_seq');   ALTER TABLE tblpk     ADD CONSTRAINT tblpk_pkey PRIMARY KEY USING INDEX _pk;    -- tblfk   ALTER TABLE tblfk     DROP COLUMN fk CASCADE;   ALTER TABLE tblfk     RENAME COLUMN _fk TO fk;   ALTER TABLE tblfk     ADD CONSTRAINT tblfk_fk_fkey       FOREIGN KEY(fk)       REFERENCES tblpk       NOT VALID; -- \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c   ALTER INDEX _fk RENAME TO tblfk_fk_fkey; COMMIT;<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0435\u0434\u0438\u043d\u044b\u043c \u043a\u0443\u0441\u043a\u043e\u043c \u043f\u043e\u0434 \u043e\u0431\u0449\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, <strong>\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u0438 DDL \u0432 PostgreSQL<\/strong>, \u043b\u0438\u0431\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043b\u0438\u0431\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0436\u0435 &#8212; \u043d\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u0435\u0441\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0441 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c &#171;\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438&#187;, \u0445\u043e\u0442\u044f \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b. \u0416\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043d\u0438\u043a\u0430\u043a, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c FK \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u0430\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0430 <code>ExclusiveLock<\/code>, \u0447\u0442\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 <strong>\u0434\u0430\u0436\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/strong>, \u043f\u043e\u043a\u0430 \u0432\u0441\u044f \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">ALTER TABLE tblfk   VALIDATE CONSTRAINT tblfk_fk_fkey;<\/code><\/pre>\n<h2>\u0427\u0442\u043e \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438?<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/p>\n<h4>\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h4>\n<p>\u0412 \u0431\u0430\u0437\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430 \u043a\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043d\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c, <strong>\u043a\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0435<\/strong>. \u0427\u0442\u043e\u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0445 \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u0447\u044c\u0438 \u0438\u043c\u0435\u043d\u0430 \u043c\u044b \u043d\u0438\u0433\u0434\u0435 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438, \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438, \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u043c:<\/p>\n<ul>\n<li>\n<p><code>tblpk_pkey<\/code> &#8212; \u0438\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430<\/p>\n<\/li>\n<li>\n<p><code>tblfk_fk_fkey<\/code> &#8212; \u0438\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430<\/p>\n<\/li>\n<li>\n<p><code>tblpk_pk_seq<\/code> &#8212; \u0438\u043c\u044f serial-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438\u0445 \u0438\u043c\u0435\u043d\u0430 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0430\u043c\u0438\u043c PostgreSQL, \u0442\u0430\u043a \u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430\u043c\u0438 \u0431\u0430\u0437\u044b &#8212; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c\u0438, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c.<\/p>\n<h4>\u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b<\/h4>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043c\u044b \u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0438 \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0443 \u043d\u0430\u0441 \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u0438\u0437 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439. \u041d\u043e FK-\u0438\u043d\u0434\u0435\u043a\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434 <code>tblfk(fk) WHERE fk IS NOT NULL<\/code>, \u0447\u0442\u043e\u0431\u044b <code>NULL<\/code>-\u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0437\u0430\u043c\u0443\u0441\u043e\u0440\u0438\u0432\u0430\u043b\u0438 \u0435\u0433\u043e, \u0430 PK \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u044f, \u043a\u0440\u043e\u043c\u0435 <code>serial<\/code>.<\/p>\n<h4>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439<\/h4>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u0447\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 &#8212; \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>MATCH PARTIAL INITIALLY DEFERRED<\/code> \u0438\u043b\u0438 <code>ON DELETE SET NULL ON UPDATE RESTRICT<\/code>.<\/p>\n<h4>\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044b<\/h4>\n<p>\u0423\u0434\u0430\u043b\u0438\u0432 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043c\u044b \u0441\u043d\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0436\u0435 \u0438 copy-\u0442\u0440\u0438\u0433\u0433\u0435\u0440. \u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u043d\u0435 \u043e\u0434\u0438\u043d \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0435?..<\/p>\n<h4>\u0418\u043c\u0435\u043d\u0430 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438<\/h4>\n<p>\u0418\u043c\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043c\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438 &#171;\u043f\u043e \u043d\u0430\u0438\u0442\u0438\u044e&#187;, \u043d\u043e \u043d\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u043e\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c FK-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0410 \u0435\u0449\u0435 \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 <code>COMMENT ON<\/code>.<\/p>\n<h2>\u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h2>\n<p>\u041f\u043e \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u044f\u0437\u0438 \u043d\u0430\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>sequence \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0435 \u0447\u0435\u0440\u0435\u0437 <code>OWNED BY<\/code>, \u0430 \u043e\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>DEFAULT<\/code><\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/p>\n<\/li>\n<li>\n<p>FK-constraint \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044f \u043f\u0430\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u0432\u0435\u0434\u0443\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e<\/p>\n<\/li>\n<\/ul>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-320171","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=320171"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320171\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}