DBA: ืืจื’ืŸ ื‘ืžื™ื•ืžื ื•ืช ืกื ื›ืจื•ืŸ ื•ื™ื™ื‘ื•ื

ืœืขื™ื‘ื•ื“ ืžื•ืจื›ื‘ ืฉืœ ืžืขืจื›ื™ ื ืชื•ื ื™ื ื’ื“ื•ืœื™ื (ืฉื•ื ื™ื ืชื”ืœื™ื›ื™ ETL: ื™ื‘ื•ื, ื”ืžืจื•ืช ื•ืกื ื›ืจื•ืŸ ืขื ืžืงื•ืจ ื—ื™ืฆื•ื ื™) ืœืขื™ืชื™ื ืงืจื•ื‘ื•ืช ื™ืฉ ืฆื•ืจืš "ืœื–ื›ื•ืจ" ื‘ืื•ืคืŸ ื–ืžื ื™ ื•ืžื™ื“ ืœืขื‘ื“ ื‘ืžื”ื™ืจื•ืช ืžืฉื”ื• ืจื‘ ืขื•ืฆืžื”.

ืžืฉื™ืžื” ื˜ื™ืคื•ืกื™ืช ืžื”ืกื•ื’ ื”ื–ื” ื‘ื“ืจืš ื›ืœืœ ื ืฉืžืขืช ื‘ืขืจืš ื›ืš: "ืžืžืฉ ื›ืืŸ ืžื—ืœืงืช ื”ื ื”ืœืช ื—ืฉื‘ื•ื ื•ืช ืฉื ืคืจืงื” ืžื‘ื ืง ื”ืœืงื•ื— ืืช ื”ืชืฉืœื•ืžื™ื ื”ืื—ืจื•ื ื™ื ืฉื”ืชืงื‘ืœื•, ืขืœื™ืš ืœื”ืขืœื•ืช ืื•ืชื ื‘ืžื”ื™ืจื•ืช ืœืืชืจ ื•ืœืงืฉืจ ืื•ืชื ืœื—ืฉื‘ื•ื ื•ืช ืฉืœืš."

ืื‘ืœ ื›ืฉื”ื ืคื— ืฉืœ ื”"ืžืฉื”ื•" ื”ื–ื” ืžืชื—ื™ืœ ืœื”ื™ืžื“ื“ ื‘ืžืื•ืช ืžื’ื”-ื‘ื™ื™ื˜, ื•ื”ืฉื™ืจื•ืช ื—ื™ื™ื‘ ืœื”ืžืฉื™ืš ืœืขื‘ื•ื“ ืขื ืžืกื“ ื”ื ืชื•ื ื™ื 24x7, ืฆืฆื•ืช ืชื•ืคืขื•ืช ืœื•ื•ืื™ ืจื‘ื•ืช ืฉื™ื”ืจืกื• ืœื›ื ืืช ื”ื—ื™ื™ื.
DBA: ืืจื’ืŸ ื‘ืžื™ื•ืžื ื•ืช ืกื ื›ืจื•ืŸ ื•ื™ื™ื‘ื•ื
ื›ื“ื™ ืœื”ืชืžื•ื“ื“ ืื™ืชื ื‘-PostgreSQL (ื•ืœื ืจืง ื‘ื•), ืชื•ื›ืœื• ืœื”ืฉืชืžืฉ ื‘ื›ืžื” ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืฉื™ืืคืฉืจื• ืœื›ื ืœืขื‘ื“ ื”ื›ืœ ืžื”ืจ ื™ื•ืชืจ ื•ืขื ืคื—ื•ืช ืฆืจื™ื›ืช ืžืฉืื‘ื™ื.

1. ืœืืŸ ืœืฉืœื•ื—?

ืจืืฉื™ืช, ื‘ื•ืื• ื ื—ืœื™ื˜ ืœืืŸ ื ื•ื›ืœ ืœื”ืขืœื•ืช ืืช ื”ื ืชื•ื ื™ื ืฉืื ื• ืจื•ืฆื™ื "ืœืขื‘ื“".

1.1. ื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช (TEMPORARY TABLE)

ื‘ืื•ืคืŸ ืขืงืจื•ื ื™, ืขื‘ื•ืจ PostgreSQL ื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช ื–ื”ื•ืช ืœื›ืœ ืฉื•ืœื—ืŸ ืื—ืจ. ืœื›ืŸ, ืืžื•ื ื•ืช ื˜ืคืœื•ืช ื›ืžื• "ื”ื›ืœ ืฉื ืžืื•ื—ืกืŸ ืจืง ื‘ื–ื™ื›ืจื•ืŸ, ื•ื–ื” ื™ื›ื•ืœ ืœื”ืกืชื™ื™ื". ืื‘ืœ ื™ืฉ ื’ื ื›ืžื” ื”ื‘ื“ืœื™ื ืžืฉืžืขื•ืชื™ื™ื.

"ืžืจื—ื‘ ืฉืžื•ืช" ืžืฉืœืš ืขื‘ื•ืจ ื›ืœ ื—ื™ื‘ื•ืจ ืœืžืกื“ ื”ื ืชื•ื ื™ื

ืื ืฉื ื™ ื—ื™ื‘ื•ืจื™ื ื ืกื” ืœื”ืชื—ื‘ืจ ื‘ื• ื–ืžื ื™ืช CREATE TABLE x, ืื– ืžื™ืฉื”ื• ื‘ื”ื—ืœื˜ ื™ืงื‘ืœ ืฉื’ื™ืืช ืื™ ื™ื™ื—ื•ื“ ืื•ื‘ื™ื™ืงื˜ื™ ืžืกื“ ื ืชื•ื ื™ื.

ืื‘ืœ ืื ืฉื ื™ื”ื ืžื ืกื™ื ืœื‘ืฆืข CREATE TEMPORARY TABLE x, ืื– ืฉื ื™ื”ื ื™ืขืฉื• ื–ืืช ื›ืจื’ื™ืœ, ื•ื›ื•ืœื ื™ืงื‘ืœื• ื”ืขื•ืชืง ืฉืœืš ืฉื•ืœื—ื ื•ืช. ื•ืœื ื™ื”ื™ื” ืฉื•ื ื“ื‘ืจ ืžืฉื•ืชืฃ ื‘ื™ื ื™ื”ื.

"ื”ืจืก ืขืฆืžื™" ื‘ืขืช ื ื™ืชื•ืง

ื›ืืฉืจ ื”ื—ื™ื‘ื•ืจ ื ืกื’ืจ, ื›ืœ ื”ื˜ื‘ืœืื•ืช ื”ื–ืžื ื™ื•ืช ื ืžื—ืงื•ืช ืื•ื˜ื•ืžื˜ื™ืช, ื›ืš ื‘ืื•ืคืŸ ื™ื“ื ื™ DROP TABLE x ืื™ืŸ ื˜ืขื ื—ื•ืฅ ืž...

ืื ืืชื” ืขื•ื‘ื“ ื“ืจืš pgbouncer ื‘ืžืฆื‘ ืขืกืงื”, ืื– ืžืกื“ ื”ื ืชื•ื ื™ื ืžืžืฉื™ืš ืœื”ืืžื™ืŸ ืฉื”ื—ื™ื‘ื•ืจ ื”ื–ื” ืขื“ื™ื™ืŸ ืคืขื™ืœ, ื•ื‘ื• ื”ื˜ื‘ืœื” ื”ื–ืžื ื™ืช ื”ื–ื• ืขื“ื™ื™ืŸ ืงื™ื™ืžืช.

ืœื›ืŸ, ื ื™ืกื™ื•ืŸ ืœื™ืฆื•ืจ ืื•ืชื• ืฉื•ื‘, ืžื—ื™ื‘ื•ืจ ืื—ืจ ืœ-pgbouncer, ื™ื’ืจื•ื ืœืฉื’ื™ืื”. ืื‘ืœ ื ื™ืชืŸ ืœืขืงื•ืฃ ื–ืืช ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ CREATE TEMPORARY TABLE IF NOT EXISTS x.

ื ื›ื•ืŸ, ื‘ื›ืœ ืžืงืจื” ืขื“ื™ืฃ ืœื ืœืขืฉื•ืช ืืช ื–ื”, ื›ื™ ืื– ืืชื” ื™ื›ื•ืœ "ืคืชืื•ื" ืœืžืฆื•ื ืฉื ืืช ื”ื ืชื•ื ื™ื ืฉื ื•ืชืจื• ืž"ื”ื‘ืขืœื™ื ื”ืงื•ื“ื". ื‘ืžืงื•ื ื–ื” ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘ ืœืงืจื•ื ืืช ื”ืžื“ืจื™ืš ื•ืœืจืื•ืช ืฉื‘ื™ืฆื™ืจืช ื˜ื‘ืœื” ืืคืฉืจ ืœื”ื•ืกื™ืฃ ON COMMIT DROP - ื›ืœื•ืžืจ, ื›ืืฉืจ ื”ืขืกืงื” ืชื•ืฉืœื, ื”ื˜ื‘ืœื” ืชื™ืžื—ืง ืื•ื˜ื•ืžื˜ื™ืช.

ืื™ ืฉื›ืคื•ืœ

ืžื›ื™ื•ื•ืŸ ืฉื”ื ืฉื™ื™ื›ื™ื ืจืง ืœื—ื™ื‘ื•ืจ ืžืกื•ื™ื, ื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช ืื™ื ืŸ ืžืฉื•ื›ืคืœื•ืช. ืื‘ืœ ื–ื” ืžื‘ื˜ืœ ืืช ื”ืฆื•ืจืš ื‘ืจื™ืฉื•ื ื›ืคื•ืœ ืฉืœ ื ืชื•ื ื™ื ื‘ืขืจื™ืžื” + WAL, ืื– INSERT/UPDATE/DELETE ืœืชื•ื›ื• ื”ื•ื ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ื™ืจ.

ืื‘ืœ ืžื›ื™ื•ื•ืŸ ืฉื˜ื‘ืœื” ื–ืžื ื™ืช ื”ื™ื ืขื“ื™ื™ืŸ ื˜ื‘ืœื” "ื›ืžืขื˜ ืจื’ื™ืœื”", ืœื ื ื™ืชืŸ ืœื™ืฆื•ืจ ืื•ืชื” ื’ื ืขืœ ื”ืขืชืง. ืœืคื—ื•ืช ื‘ื™ื ืชื™ื™ื, ืœืžืจื•ืช ืฉื”ืชื™ืงื•ืŸ ื”ืžืงื‘ื™ืœ ืžืกืชื•ื‘ื‘ ื›ื‘ืจ ื”ืจื‘ื” ื–ืžืŸ.

1.2. ื˜ื‘ืœื” ืœื ืจืฉื•ืžื”

ืื‘ืœ ืžื” ืขืœื™ืš ืœืขืฉื•ืช, ืœืžืฉืœ, ืื ื™ืฉ ืœืš ืื™ื–ืฉื”ื• ืชื”ืœื™ืš ETL ืžืกื•ืจื‘ืœ ืฉืœื ื ื™ืชืŸ ืœื™ื™ืฉื ื‘ืขืกืงื” ืื—ืช, ืื‘ืœ ืขื“ื™ื™ืŸ ื™ืฉ ืœืš pgbouncer ื‘ืžืฆื‘ ืขืกืงื”? ..

ืื• ืฉื–ืจื™ืžืช ื”ื ืชื•ื ื™ื ื›ืœ ื›ืš ื’ื“ื•ืœื” ืื™ืŸ ืžืกืคื™ืง ืจื•ื—ื‘ ืคืก ื‘ื—ื™ื‘ื•ืจ ืื—ื“ ืžืžืกื“ ื ืชื•ื ื™ื (ืงืจื™ืื”, ืชื”ืœื™ืš ืื—ื“ ืœื›ืœ ืžืขื‘ื“)?..

ืื• ืฉื›ืžื” ืคืขื•ืœื•ืช ืžืชืจื—ืฉื•ืช ื‘ืื•ืคืŸ ืืกื™ื ื›ืจื•ื ื™ ื‘ืงืฉืจื™ื ืฉื•ื ื™ื?..

ื™ืฉ ื›ืืŸ ืจืง ืืคืฉืจื•ืช ืื—ืช - ืฆื•ืจ ื‘ืื•ืคืŸ ื–ืžื ื™ ื˜ื‘ืœื” ืœื ื–ืžื ื™ืช. ืžืฉื—ืง ืžื™ืœื™ื, ื›ืŸ. ื–ื”:

  • ื™ืฆืจ ื˜ื‘ืœืื•ืช "ืฉืœื™" ืขื ืฉืžื•ืช ืืงืจืื™ื™ื ืžืงืกื™ืžืœื™ื™ื ื›ื“ื™ ืœื ืœื”ืฆื˜ืœื‘ ืขื ืืฃ ืื—ื“
  • ืœื”ื•ืฆื™ื: ืžื™ืœื ืื•ืชื ื‘ื ืชื•ื ื™ื ืžืžืงื•ืจ ื—ื™ืฆื•ื ื™
  • ืœืฉื ื•ืช: ื”ื•ืžืจ, ืžื™ืœื ืฉื“ื•ืช ืžืคืชื— ืžืงืฉืจื™ื
  • ืœึดื˜ืขื•ึนืŸ: ื™ืฆืง ื ืชื•ื ื™ื ืžื•ื›ื ื™ื ืœื˜ื‘ืœืื•ืช ื™ืขื“
  • ืžื—ืง ืืช ื”ื˜ื‘ืœืื•ืช "ืฉืœื™".

ื•ืขื›ืฉื™ื• - ื–ื‘ื•ื‘ ื‘ืžืฉื—ื”. ืœืžืขืฉื”, ื›ืœ ื”ื›ืชื™ื‘ื” ื‘-PostgreSQL ืžืชืจื—ืฉืช ืคืขืžื™ื™ื - ืจืืฉื•ืŸ ื‘-WAL, ื•ืื– ืœืชื•ืš ื’ื•ืคื™ ื”ื˜ื‘ืœื”/ืื™ื ื“ืงืก. ื›ืœ ื–ื” ื ืขืฉื” ื›ื“ื™ ืœืชืžื•ืš ื‘-ACID ื•ืœื ืจืื•ืช ื ืชื•ื ื™ื ื ื›ื•ื ื” ื‘ื™ื ื™ื”ื COMMIT' ืžื˜ื•ืจืฃ ื• ROLLBACK'ืขืกืงืื•ืช ืืคืก.

ืื‘ืœ ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืืช ื–ื”! ื™ืฉ ืœื ื• ืืช ื›ืœ ื”ืชื”ืœื™ืš ืื• ืฉื–ื” ื”ื™ื” ืœื’ืžืจื™ ืžื•ืฆืœื— ืื• ืฉืœื.. ืœื ืžืฉื ื” ื›ืžื” ืขืกืงืื•ืช ื‘ื™ื ื™ื™ื ื™ื”ื™ื• - ืื ื—ื ื• ืœื ืžืขื•ื ื™ื™ื ื™ื "ืœื”ืžืฉื™ืš ืืช ื”ืชื”ืœื™ืš ืžื”ืืžืฆืข", ื‘ืžื™ื•ื—ื“ ื›ืฉืœื ื‘ืจื•ืจ ืื™ืคื” ื–ื” ื”ื™ื”.

ืœืฉื ื›ืš, ืžืคืชื—ื™ PostgreSQL, ืขื•ื“ ื‘ื’ืจืกื” 9.1, ื”ืฆื™ื’ื• ื“ื‘ืจ ื›ื–ื” ื˜ื‘ืœืื•ืช ืžื ื•ืชืงื•ืช:

ืขื ืื™ื ื“ื™ืงืฆื™ื” ื–ื•, ื”ื˜ื‘ืœื” ื ื•ืฆืจืช ื›ื‘ืœืชื™ ืจืฉื•ืžื”. ื ืชื•ื ื™ื ืฉื ื›ืชื‘ื• ืœื˜ื‘ืœืื•ืช ืœื ืจืฉื•ืžื•ืช ืœื ืขื•ื‘ืจื™ื ื‘ื™ื•ืžืŸ ื”ื›ืชื™ื‘ื” ืงื“ื™ืžื” (ืจืื” ืคืจืง 29), ืžื” ืฉื’ื•ืจื ืœื˜ื‘ืœืื•ืช ื›ืืœื” ืœืขื‘ื•ื“ ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ืจ ืžื”ืจื’ื™ืœ. ืขื ื–ืืช, ื”ื ืื™ื ื ื—ืกื™ื ื™ื ืžืคื ื™ ื›ื™ืฉืœื•ืŸ; ื‘ืžืงืจื” ืฉืœ ื›ืฉืœ ื‘ืฉืจืช ืื• ื›ื™ื‘ื•ื™ ื—ื™ืจื•ื, ื˜ื‘ืœื” ืœื ืจืฉื•ืžื” ื ื—ืชืš ืื•ื˜ื•ืžื˜ื™ืช. ื‘ื ื•ืกืฃ, ื”ืชื•ื›ืŸ ืฉืœ ื”ื˜ื‘ืœื” ืฉืœื ื ืจืฉืžื” ืœื ืžืฉื•ื›ืคืœ ืœืฉืจืชื™ ืขื‘ื“ื™ื. ื›ืœ ื”ืื™ื ื“ืงืกื™ื ืฉื ื•ืฆืจื• ื‘ื˜ื‘ืœื” ืœื ืจืฉื•ืžื” ื”ื•ืคื›ื™ื ืื•ื˜ื•ืžื˜ื™ืช ืœื‘ื™ื˜ื•ืœ ืจื™ืฉื•ื.

ื‘ืงื™ืฆื•ืจ, ื–ื” ื™ื”ื™ื” ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ื™ืจ, ืื‘ืœ ืื ืฉืจืช ืžืกื“ ื”ื ืชื•ื ื™ื "ื ื•ืคืœ", ื–ื” ื™ื”ื™ื” ืœื ื ืขื™ื. ืื‘ืœ ื‘ืื™ื–ื• ืชื“ื™ืจื•ืช ื–ื” ืงื•ืจื”, ื•ื”ืื ืชื”ืœื™ืš ื”-ETL ืฉืœืš ื™ื•ื“ืข ืœืชืงืŸ ื–ืืช ื‘ืฆื•ืจื” ื ื›ื•ื ื” "ืžื”ืืžืฆืข" ืœืื—ืจ "ื”ื—ื™ื™ืืช" ืžืกื“ ื”ื ืชื•ื ื™ื?..

ืื ืœื, ื•ื”ืžืงืจื” ืฉืœืžืขืœื” ื“ื•ืžื” ืœืฉืœืš, ื”ืฉืชืžืฉ UNLOGGEDืื‘ืœ ืืฃ ืคืขื ืืœ ืชืคืขื™ืœ ืืช ื”ืชื›ื•ื ื” ื”ื–ื• ื‘ื˜ื‘ืœืื•ืช ืืžื™ืชื™ื•ืช, ืฉื”ื ืชื•ื ื™ื ืžื”ื ื™ืงืจื™ื ืœืš.

1.3. ื‘-COMMIT { ืžื—ืง ืฉื•ืจื•ืช | ื™ึฐืจึดื™ื“ึธื”}

ืžื‘ื ื” ื–ื” ืžืืคืฉืจ ืœืš ืœืฆื™ื™ืŸ ื”ืชื ื”ื’ื•ืช ืื•ื˜ื•ืžื˜ื™ืช ื›ืืฉืจ ืขืกืงื” ื”ื•ืฉืœืžื” ื‘ืขืช ื™ืฆื™ืจืช ื˜ื‘ืœื”.

ืขืœ ON COMMIT DROP ื›ื‘ืจ ื›ืชื‘ืชื™ ืœืžืขืœื”, ื–ื” ืžื™ื™ืฆืจ DROP TABLE, ืื‘ืœ ืขื ON COMMIT DELETE ROWS ื”ืžืฆื‘ ื™ื•ืชืจ ืžืขื ื™ื™ืŸ - ื”ื•ื ื ื•ืฆืจ ื›ืืŸ TRUNCATE TABLE.

ืžื›ื™ื•ื•ืŸ ืฉื›ืœ ื”ืชืฉืชื™ืช ืœืื—ืกื•ืŸ ื”ืžื˜ื-ืชื™ืื•ืจ ืฉืœ ื˜ื‘ืœื” ื–ืžื ื™ืช ื–ื”ื” ืœื—ืœื•ื˜ื™ืŸ ืœื–ื• ืฉืœ ื˜ื‘ืœื” ืจื’ื™ืœื”, ืื– ื™ืฆื™ืจื” ื•ืžื—ื™ืงื” ืžืชืžื“ืช ืฉืœ ื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช ืžื•ื‘ื™ืœื” ืœ"ื ืคื™ื—ื•ืช" ื—ืžื•ืจื” ืฉืœ ื˜ื‘ืœืื•ืช ื”ืžืขืจื›ืช pg_class, pg_attribute, pg_attrdef, pg_depend,...

ืขื›ืฉื™ื• ืชืืจื• ืœืขืฆืžื›ื ืฉื™ืฉ ืœื›ื ืขื•ื‘ื“ ื‘ื—ื™ื‘ื•ืจ ื™ืฉื™ืจ ืœืžืกื“ ื”ื ืชื•ื ื™ื, ืฉืคื•ืชื— ื›ืœ ืฉื ื™ื™ื” ื˜ืจื ื–ืงืฆื™ื” ื—ื“ืฉื”, ื™ื•ืฆืจ, ืžืžืœื, ืžืขื‘ื“ ื•ืžื•ื—ืง ื˜ื‘ืœื” ื–ืžื ื™ืช... ื™ื”ื™ื” ืขื•ื“ืฃ ืฉืœ ื–ื‘ืœ ืžืฆื˜ื‘ืจ ื‘ื˜ื‘ืœืื•ืช ื”ืžืขืจื›ืช, ื•ื›ืŸ ื–ื” ื™ื’ืจื•ื ืœื‘ืœืžื™ื ื ื•ืกืคื™ื ืขื‘ื•ืจ ื›ืœ ืคืขื•ืœื”.

ื‘ืื•ืคืŸ ื›ืœืœื™, ืืœ ืชืขืฉื” ืืช ื–ื”! ื‘ืžืงืจื” ื”ื–ื” ื–ื” ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœ CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS ืœื”ื•ืฆื™ื ืื•ืชื• ืžืžื—ื–ื•ืจ ื”ืขืกืงืื•ืช - ืื– ื‘ืชื—ื™ืœืช ื›ืœ ืขืกืงื” ื—ื“ืฉื” ื”ื˜ื‘ืœืื•ืช ื›ื‘ืจ ื ืžืฆืื•ืช ื™ื”ื™ื” ืงื™ื™ื (ืฉืžื•ืจ ืฉื™ื—ื” CREATE), ืื‘ืœ ื™ื”ื™ื” ืจื™ืง, ื”ื•ื“ื•ืช ืœ TRUNCATE (ืฉืžืจื ื• ื’ื ืืช ื”ืฉื™ื—ื” ืฉืœื•) ื‘ืขืช ื”ืฉืœืžืช ื”ืขืกืงื” ื”ืงื•ื“ืžืช.

1.4. ืœื™ื™ืง...ื›ื•ืœืœ...

ืฆื™ื™ื ืชื™ ื‘ื”ืชื—ืœื” ืฉืื—ื“ ืžืžืงืจื™ ื”ืฉื™ืžื•ืฉ ื”ืื•ืคื™ื™ื ื™ื™ื ืœื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช ื”ื•ื ืกื•ื’ื™ื ืฉื•ื ื™ื ืฉืœ ื™ื‘ื•ื - ื•ื”ืžืคืชื— ืžื“ื‘ื™ืง ืœืขื™ื™ืคื” ืืช ืจืฉื™ืžืช ื”ืฉื“ื•ืช ืฉืœ ื˜ื‘ืœืช ื”ื™ืขื“ ืœื”ืฆื”ืจื” ืขืœ ื”ื–ืžื ื™ ืฉืœื•...

ืื‘ืœ ืขืฆืœื•ืช ื”ื™ื ืžื ื•ืข ื”ืงื™ื“ืžื”! ื‘ื’ืœืœ ื–ื” ืฆื•ืจ ื˜ื‘ืœื” ื—ื“ืฉื” "ืžื‘ื•ืกืก ืขืœ ืžื“ื’ื" ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜:

CREATE TEMPORARY TABLE import_table(
  LIKE target_table
);

ืžื›ื™ื•ื•ืŸ ืฉืืชื” ื™ื›ื•ืœ ืœื”ืคื™ืง ื ืชื•ื ื™ื ืจื‘ื™ื ืœืชื•ืš ื”ื˜ื‘ืœื” ื”ื–ื•, ื”ื—ื™ืคื•ืฉ ื‘ื” ืœืขื•ืœื ืœื ื™ื”ื™ื” ืžื”ื™ืจ. ืื‘ืœ ื™ืฉ ืœื–ื” ืคืชืจื•ืŸ ืžืกื•ืจืชื™ - ืื™ื ื“ืงืกื™ื! ื•ื›ืŸ, ื˜ื‘ืœื” ื–ืžื ื™ืช ื™ื›ื•ืœื” ืœื›ืœื•ืœ ื’ื ืื™ื ื“ืงืกื™ื.

ืžื›ื™ื•ื•ืŸ ืฉืœืขืชื™ื ืงืจื•ื‘ื•ืช ื”ืื™ื ื“ืงืกื™ื ื”ื ื“ืจืฉื™ื ืขื•ืœื™ื ื‘ืงื ื” ืื—ื“ ืขื ื”ืื™ื ื“ืงืกื™ื ืฉืœ ื˜ื‘ืœืช ื”ื™ืขื“, ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื›ืชื•ื‘ LIKE target_table INCLUDING INDEXES.

ืื ื’ื ืืชื” ืฆืจื™ืš DEFAULT-ืขืจื›ื™ื (ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœืžืœื ืืช ืขืจื›ื™ ื”ืžืคืชื— ื”ืจืืฉื™), ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ LIKE target_table INCLUDING DEFAULTS. ืื• ื‘ืคืฉื˜ื•ืช - LIKE target_table INCLUDING ALL - ืžืขืชื™ืง ื‘ืจื™ืจื•ืช ืžื—ื“ืœ, ืื™ื ื“ืงืกื™ื, ืื™ืœื•ืฆื™ื,...

ืื‘ืœ ื›ืืŸ ืืชื” ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืฉืื ืืชื” ื™ืฆืจืช ื™ื™ื‘ื ื˜ื‘ืœื” ืžื™ื“ ืขื ืื™ื ื“ืงืกื™ื, ื•ืื– ื™ื™ืงื— ื™ื•ืชืจ ื–ืžืŸ ืœื˜ืขื™ื ืช ื”ื ืชื•ื ื™ืืžืืฉืจ ืื ืงื•ื“ื ืชืžืœื ื”ื›ืœ, ื•ืจืง ืื– ืชื’ืœื’ืœ ืืช ื”ืื™ื ื“ืงืกื™ื - ืชืจืื” ืื™ืš ื–ื” ืขื•ืฉื” ืืช ื–ื” ื›ื“ื•ื’ืžื” pg_dump.

ื‘ืื•ืคืŸ ื›ืœืœื™ RTFM!

2. ืื™ืš ื›ื•ืชื‘ื™ื?

ืชืŸ ืœื™ ืจืง ืœื•ืžืจ - ื”ืฉืชืžืฉ ื‘ื• COPY-ื–ืจื™ืžื” ื‘ืžืงื•ื "ื—ื‘ื™ืœื”" INSERT, ื”ืืฆื” ืœืคืขืžื™ื. ืืชื” ื™ื›ื•ืœ ืืคื™ืœื• ื™ืฉื™ืจื•ืช ืžืงื•ื‘ืฅ ืฉื ื•ืฆืจ ืžืจืืฉ.

3. ืื™ืš ืœืขื‘ื“?

ืื– ื‘ื•ื ื ื’ื™ื“ ืฉื”ืžื‘ื•ื ืฉืœื ื• ื ืจืื” ื‘ืขืจืš ื›ืš:

  • ื™ืฉ ืœืš ื˜ื‘ืœื” ืขื ื ืชื•ื ื™ ืœืงื•ื— ื”ืžืื•ื—ืกื ื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœืš 1 ืžื™ืœื™ื•ืŸ ืฉื™ืื™ื
  • ื›ืœ ื™ื•ื ืœืงื•ื— ืฉื•ืœื— ืœืš ืื—ื“ ื—ื“ืฉ "ืชืžื•ื ื”" ืžืœืื”
  • ืžื ื™ืกื™ื•ืŸ ืืชื” ื™ื•ื“ืข ืืช ื–ื” ืžื“ื™ ืคืขื ืœื ื™ื•ืชืจ ืž-10K ืจืฉื•ืžื•ืช ืžืฉืชื ื•ืช

ื“ื•ื’ืžื” ืงืœืืกื™ืช ืœืžืฆื‘ ื›ื–ื” ื”ื™ื ื‘ืกื™ืก KLADR โ€” ื™ืฉ ื”ืจื‘ื” ื›ืชื•ื‘ื•ืช ื‘ืกืš ื”ื›ืœ, ืื‘ืœ ื‘ื›ืœ ื”ืขืœืื” ืฉื‘ื•ืขื™ืช ื™ืฉ ืžืขื˜ ืžืื•ื“ ืฉื™ื ื•ื™ื™ื (ืฉืžื•ืช ืฉืœ ื”ืชื ื—ืœื•ื™ื•ืช, ืฉื™ืœื•ื‘ ืจื—ื•ื‘ื•ืช, ืžืจืื” ื‘ืชื™ื ื—ื“ืฉื™ื) ืืคื™ืœื• ื‘ืงื ื” ืžื™ื“ื” ืืจืฆื™.

3.1. ืืœื’ื•ืจื™ืชื ืกื ื›ืจื•ืŸ ืžืœื

ืœืฉื ื”ืคืฉื˜ื•ืช, ื ื ื™ื— ืฉืืชื” ืืคื™ืœื• ืœื ืฆืจื™ืš ืœื‘ื ื•ืช ืžื—ื“ืฉ ืืช ื”ื ืชื•ื ื™ื - ืคืฉื•ื˜ ื”ื›ื ืก ืืช ื”ื˜ื‘ืœื” ืœืฆื•ืจื” ื”ืจืฆื•ื™ื”, ื›ืœื•ืžืจ:

  • ืœื”ืกื™ืจ ื›ืœ ืžื” ืฉื›ื‘ืจ ืœื ืงื™ื™ื
  • ืขื“ื›ื•ืŸ ื›ืœ ืžื” ืฉื›ื‘ืจ ืงื™ื™ื ื•ืฆืจื™ืš ืœืขื“ื›ืŸ
  • ื”ื›ื ืก ื›ืœ ืžื” ืฉืขื“ื™ื™ืŸ ืœื ืงืจื”

ืœืžื” ืฆืจื™ืš ืœืขืฉื•ืช ืืช ื”ืคืขื•ืœื•ืช ื‘ืกื“ืจ ื”ื–ื”? ื›ื™ ื›ื›ื” ื’ื•ื“ืœ ื”ืฉื•ืœื—ืŸ ื™ื’ื“ืœ ืžื™ื ื™ืžืœื™ืช (ื–ื›ื•ืจ MVCC!).

ืžื—ืง ืž-dst

ืœื, ื›ืžื•ื‘ืŸ ืฉืืชื” ื™ื›ื•ืœ ืœื”ืกืชื“ืจ ืขื ืฉืชื™ ืคืขื•ืœื•ืช ื‘ืœื‘ื“:

  • ืœื”ืกื™ืจ (DELETE) ื”ื›ืœ ื‘ืื•ืคืŸ ื›ืœืœื™
  • ื”ื›ื ืก ื”ื›ืœ ืžื”ืชืžื•ื ื” ื”ื—ื“ืฉื”

ืื‘ืœ ื‘ืžืงื‘ื™ืœ, ื”ื•ื“ื•ืช ืœ-MVCC, ื’ื•ื“ืœ ื”ืฉื•ืœื—ืŸ ื™ื’ื“ืœ ื‘ื“ื™ื•ืง ืคืขืžื™ื™ื! ืงื‘ืœืช +1M ืชืžื•ื ื•ืช ืฉืœ ืจืฉื•ืžื•ืช ื‘ื˜ื‘ืœื” ืขืงื‘ ืขื“ื›ื•ืŸ ืฉืœ 10K ื”ื™ื ื›ืœ ื›ืš ื™ืชื™ืจื•ืช...

TRUNCATE dst

ืžืคืชื— ืžื ื•ืกื” ื™ื•ืชืจ ื™ื•ื“ืข ืฉื ื™ืชืŸ ืœื ืงื•ืช ืืช ื”ื˜ืื‘ืœื˜ ื›ื•ืœื• ื‘ื–ื•ืœ ืœืžื“ื™:

  • ื‘ืจื•ืจ (TRUNCATE) ื›ืœ ื”ืฉื•ืœื—ืŸ
  • ื”ื›ื ืก ื”ื›ืœ ืžื”ืชืžื•ื ื” ื”ื—ื“ืฉื”

ื”ืฉื™ื˜ื” ื™ืขื™ืœื”, ืœืคืขืžื™ื ื™ืฉื™ื ืœืžื“ื™, ืื‘ืœ ื™ืฉ ื‘ืขื™ื”... ืื ื—ื ื• ื ื•ืกื™ืฃ ืจืฉื•ืžื•ืช ืฉืœ 1M ื‘ืžืฉืš ื–ืžืŸ ืจื‘, ื›ืš ืฉืœื ื ื•ื›ืœ ืœื”ืจืฉื•ืช ืœืขืฆืžื ื• ืœื”ืฉืื™ืจ ืืช ื”ื˜ื‘ืœื” ืจื™ืงื” ื‘ืžืฉืš ื›ืœ ื”ื–ืžืŸ ื”ื–ื” (ื›ืžื• ืฉื™ืงืจื” ื‘ืœื™ ืœืขื˜ื•ืฃ ืื•ืชื” ื‘ืขืกืงื” ืื—ืช).

ืืฉืจ ืื•ืžืจ:

  • ืื ื—ื ื• ืžืชื—ื™ืœื™ื ืขืกืงื” ืืจื•ื›ืช ืฉื ื™ื
  • TRUNCATE ื›ื•ืคื” ื’ื™ืฉื” ื‘ืœืขื“ื™ืช-ื—ืกื™ืžื”
  • ืื ื—ื ื• ืžื‘ืฆืขื™ื ืืช ื”ื”ื›ื ืกื” ื‘ืžืฉืš ื–ืžืŸ ืจื‘, ื•ื›ืœ ื”ืฉืืจ ื‘ื–ืžืŸ ื”ื–ื” ืœื ื™ื›ื•ืœ ืืคื™ืœื• SELECT

ืžืฉื”ื• ืœื ื”ื•ืœืš ื˜ื•ื‘...

ืฉื ื” ื˜ื‘ืœื”... ืฉื ื” ืฉื... / ื–ืจื•ืง ื˜ื‘ืœื”...

ื—ืœื•ืคื” ื”ื™ื ืœืžืœื ื”ื›ืœ ืœื˜ื‘ืœื” ื—ื“ืฉื” ื ืคืจื“ืช, ื•ืื– ืคืฉื•ื˜ ืœืฉื ื•ืช ืืช ืฉืžื” ื‘ืžืงื•ื ื”ื™ืฉืŸ. ื›ืžื” ื“ื‘ืจื™ื ืงื˜ื ื™ื ื•ืžื’ืขื™ืœื™ื:

  • ื’ื ืขื“ื™ื™ืŸ ื’ื™ืฉื” ื‘ืœืขื“ื™ืช, ืื ื›ื™ ืคื—ื•ืช ื–ืžืŸ ืžืฉืžืขื•ืชื™ืช
  • ื›ืœ ืชื•ื›ื ื™ื•ืช ื”ืฉืื™ืœืชื”/ื ืชื•ื ื™ื ืกื˜ื˜ื™ืกื˜ื™ื™ื ืขื‘ื•ืจ ื˜ื‘ืœื” ื–ื• ืžืื•ืคืกื™ื, ืฆืจื™ืš ืœื”ืคืขื™ืœ ืืช ANALYZE
  • ื›ืœ ื”ืžืคืชื—ื•ืช ื”ื–ืจื™ื ืฉื‘ื•ืจื™ื (FK) ืœืฉื•ืœื—ืŸ

ื”ื™ื” ืชื™ืงื•ืŸ WIP ืžืกื™ื™ืžื•ืŸ ืจื™ื’ืก ืฉื”ืฆื™ืข ืœืขืฉื•ืช ALTER-ืคืขื•ืœื” ืœื”ื—ืœืคืช ื’ื•ืฃ ื”ื˜ื‘ืœื” ื‘ืจืžืช ื”ืงื•ื‘ืฅ, ืœืœื ื ื’ื™ืขื” ื‘ืกื˜ื˜ื™ืกื˜ื™ืงื” ื•ื‘-FK, ืืš ืœื ืืกืคื” ืžื ื™ื™ืŸ.

ืžื—ืง, ืขื“ื›ืŸ, ื”ื•ืกืฃ

ืื–, ืื ื—ื ื• ืžืกืชืคืงื™ื ื‘ืืคืฉืจื•ืช ืœืœื ื—ืกื™ืžื” ืฉืœ ืฉืœื•ืฉ ืคืขื•ืœื•ืช. ื›ืžืขื˜ ืฉืœื•ืฉื”... ืื™ืš ืขื•ืฉื™ื ื–ืืช ื‘ืฆื•ืจื” ื”ื™ืขื™ืœื” ื‘ื™ื•ืชืจ?

-- ะฒัะต ะดะตะปะฐะตะผ ะฒ ั€ะฐะผะบะฐั… ั‚ั€ะฐะฝะทะฐะบั†ะธะธ, ั‡ั‚ะพะฑั‹ ะฝะธะบั‚ะพ ะฝะต ะฒะธะดะตะป "ะฟั€ะพะผะตะถัƒั‚ะพั‡ะฝั‹ั…" ัะพัั‚ะพัะฝะธะน
BEGIN;

-- ัะพะทะดะฐะตะผ ะฒั€ะตะผะตะฝะฝัƒัŽ ั‚ะฐะฑะปะธั†ัƒ ั ะธะผะฟะพั€ั‚ะธั€ัƒะตะผั‹ะผะธ ะดะฐะฝะฝั‹ะผะธ
CREATE TEMPORARY TABLE tmp(
  LIKE dst INCLUDING INDEXES -- ะฟะพ ะพะฑั€ะฐะทัƒ ะธ ะฟะพะดะพะฑะธัŽ, ะฒะผะตัั‚ะต ั ะธะฝะดะตะบัะฐะผะธ
) ON COMMIT DROP; -- ะทะฐ ั€ะฐะผะบะฐะผะธ ั‚ั€ะฐะฝะทะฐะบั†ะธะธ ะพะฝะฐ ะฝะฐะผ ะฝะต ะฝัƒะถะฝะฐ

-- ะฑั‹ัั‚ั€ะพ-ะฑั‹ัั‚ั€ะพ ะฒะปะธะฒะฐะตะผ ะฝะพะฒั‹ะน ะพะฑั€ะฐะท ั‡ะตั€ะตะท COPY
COPY tmp FROM STDIN;
-- ...
-- .

-- ัƒะดะฐะปัะตะผ ะพั‚ััƒั‚ัั‚ะฒัƒัŽั‰ะธะต
DELETE FROM
  dst D
USING
  dst X
LEFT JOIN
  tmp Y
    USING(pk1, pk2) -- ะฟะพะปั ะฟะตั€ะฒะธั‡ะฝะพะณะพ ะบะปัŽั‡ะฐ
WHERE
  (D.pk1, D.pk2) = (X.pk1, X.pk2) AND
  Y IS NOT DISTINCT FROM NULL; -- "ะฐะฝั‚ะธะดะถะพะนะฝ"

-- ะพะฑะฝะพะฒะปัะตะผ ะพัั‚ะฐะฒัˆะธะตัั
UPDATE
  dst D
SET
  (f1, f2, f3) = (T.f1, T.f2, T.f3)
FROM
  tmp T
WHERE
  (D.pk1, D.pk2) = (T.pk1, T.pk2) AND
  (D.f1, D.f2, D.f3) IS DISTINCT FROM (T.f1, T.f2, T.f3); -- ะฝะตะทะฐั‡ะตะผ ะพะฑะฝะพะฒะปัั‚ัŒ ัะพะฒะฟะฐะดะฐัŽั‰ะธะต

-- ะฒัั‚ะฐะฒะปัะตะผ ะพั‚ััƒั‚ัั‚ะฒัƒัŽั‰ะธะต
INSERT INTO
  dst
SELECT
  T.*
FROM
  tmp T
LEFT JOIN
  dst D
    USING(pk1, pk2)
WHERE
  D IS NOT DISTINCT FROM NULL;

COMMIT;

3.2. ื™ื™ื‘ื•ื โ€‹โ€‹ืœืื—ืจ ืขื™ื‘ื•ื“

ื‘ืื•ืชื• KLADR, ื™ืฉ ืœื”ืคืขื™ืœ ื‘ื ื•ืกืฃ ืืช ื›ืœ ื”ืจืฉื•ืžื•ืช ืฉื”ืฉืชื ื• ื‘ืืžืฆืขื•ืช ืขื™ื‘ื•ื“ ืฉืœืื—ืจ - ืžื ื•ืจืžืœ, ืžื™ืœื•ืช ืžืคืชื— ืžื•ื“ื’ืฉื•ืช ื•ื”ืงื˜ื ื” ืœืžื‘ื ื™ื ื”ื ื“ืจืฉื™ื. ืื‘ืœ ืื™ืš ืืชื” ื™ื•ื“ืข - ืžื” ื‘ื“ื™ื•ืง ื”ืฉืชื ื”ื‘ืœื™ ืœืกื‘ืš ืืช ืงื•ื“ ื”ืกื ื›ืจื•ืŸ, ื‘ืื•ืคืŸ ืื™ื“ื™ืืœื™ ื‘ืœื™ ืœื’ืขืช ื‘ื• ื‘ื›ืœืœ?

ืื ืจืง ืœืชื”ืœื™ืš ืฉืœืš ื™ืฉ ื’ื™ืฉืช ื›ืชื™ื‘ื” ื‘ื–ืžืŸ ื”ืกื ื›ืจื•ืŸ, ืื– ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื˜ืจื™ื’ืจ ืฉื™ืืกื•ืฃ ืขื‘ื•ืจื ื• ืืช ื›ืœ ื”ืฉื™ื ื•ื™ื™ื:

-- ั†ะตะปะตะฒั‹ะต ั‚ะฐะฑะปะธั†ั‹
CREATE TABLE kladr(...);
CREATE TABLE kladr_house(...);

-- ั‚ะฐะฑะปะธั†ั‹ ั ะธัั‚ะพั€ะธะตะน ะธะทะผะตะฝะตะฝะธะน
CREATE TABLE kladr$log(
  ro kladr, -- ั‚ัƒั‚ ะปะตะถะฐั‚ ั†ะตะปั‹ะต ะพะฑั€ะฐะทั‹ ะทะฐะฟะธัะตะน ัั‚ะฐั€ะพะน/ะฝะพะฒะพะน
  rn kladr
);

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

-- ะพะฑั‰ะฐั ั„ัƒะฝะบั†ะธั ะปะพะณะธั€ะพะฒะฐะฝะธั ะธะทะผะตะฝะตะฝะธะน
CREATE OR REPLACE FUNCTION diff$log() RETURNS trigger AS $$
DECLARE
  dst varchar = TG_TABLE_NAME || '$log';
  stmt text = '';
BEGIN
  -- ะฟั€ะพะฒะตั€ัะตะผ ะฝะตะพะฑั…ะพะดะธะผะพัั‚ัŒ ะปะพะณะณะธั€ะพะฒะฐะฝะธั ะฟั€ะธ ะพะฑะฝะพะฒะปะตะฝะธะธ ะทะฐะฟะธัะธ
  IF TG_OP = 'UPDATE' THEN
    IF NEW IS NOT DISTINCT FROM OLD THEN
      RETURN NEW;
    END IF;
  END IF;
  -- ัะพะทะดะฐะตะผ ะทะฐะฟะธััŒ ะปะพะณะฐ
  stmt = 'INSERT INTO ' || dst::text || '(ro,rn)VALUES(';
  CASE TG_OP
    WHEN 'INSERT' THEN
      EXECUTE stmt || 'NULL,$1)' USING NEW;
    WHEN 'UPDATE' THEN
      EXECUTE stmt || '$1,$2)' USING OLD, NEW;
    WHEN 'DELETE' THEN
      EXECUTE stmt || '$1,NULL)' USING OLD;
  END CASE;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

ื›ืขืช ืื ื• ื™ื›ื•ืœื™ื ืœื”ื—ื™ืœ ื˜ืจื™ื’ืจื™ื ืœืคื ื™ ื”ืชื—ืœืช ื”ืกื ื›ืจื•ืŸ (ืื• ืœื”ืคืขื™ืœ ืื•ืชื ื‘ืืžืฆืขื•ืช ALTER TABLE ... ENABLE TRIGGER ...):

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

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

ื•ืื– ืื ื—ื ื• ืžื—ืœืฆื™ื ื‘ืฉืœื•ื•ื” ืืช ื›ืœ ื”ืฉื™ื ื•ื™ื™ื ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืžื˜ื‘ืœืื•ืช ื”ื™ื•ืžืŸ ื•ืžืจื™ืฆื™ื ืื•ืชื ื“ืจืš ืžื˜ืคืœื™ื ื ื•ืกืคื™ื.

3.3. ื™ื™ื‘ื•ื โ€‹โ€‹ืกื˜ื™ื ืžืงื•ืฉืจื™ื

ืœืขื™ืœ ืฉืงืœื ื• ืžืงืจื™ื ืฉื‘ื”ื ืžื‘ื ื™ ื”ื ืชื•ื ื™ื ืฉืœ ื”ืžืงื•ืจ ื•ื”ื™ืขื“ ื–ื”ื™ื. ืื‘ืœ ืžื” ืื ืœื”ืขืœืื” ืžืžืขืจื›ืช ื—ื™ืฆื•ื ื™ืช ื™ืฉ ืคื•ืจืžื˜ ืฉื•ื ื” ืžืžื‘ื ื” ื”ืื—ืกื•ืŸ ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœื ื•?

ื ื™ืงื— ื›ื“ื•ื’ืžื” ืืช ื”ืื—ืกื•ืŸ ืฉืœ ืœืงื•ื—ื•ืช ื•ื—ืฉื‘ื•ื ื•ืชื™ื”ื, ื”ืืคืฉืจื•ืช ื”ืงืœืืกื™ืช "ืจื‘ื™ื ืœืื—ื“":

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

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

ืื‘ืœ ื”ื”ื•ืจื“ื” ืžืžืงื•ืจ ื—ื™ืฆื•ื ื™ ืžื’ื™ืขื” ืืœื™ื ื• ื‘ืฆื•ืจื” ืฉืœ "ื”ื›ืœ ื‘ืื—ื“":

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

ื‘ืจื•ืจ ืฉื ื™ืชืŸ ืœืฉื›ืคืœ ื ืชื•ื ื™ ืœืงื•ื—ื•ืช ื‘ื’ืจืกื” ื–ื•, ื•ื”ืจืฉื•ืžื” ื”ืขื™ืงืจื™ืช ื”ื™ื "ื—ืฉื‘ื•ืŸ":

0123456789;ะ’ะฐัั;A-01;2020-03-16;1000.00
9876543210;ะŸะตั‚ั;A-02;2020-03-16;666.00
0123456789;ะ’ะฐัั;B-03;2020-03-16;9999.00

ืขื‘ื•ืจ ื”ืžื•ื“ืœ, ืคืฉื•ื˜ ื ื•ืกื™ืฃ ืืช ื ืชื•ื ื™ ื”ื‘ื“ื™ืงื” ืฉืœื ื•, ืืš ื–ื›ืจื• - COPY ื™ื•ืชืจ ื™ืขื™ืœ!

INSERT INTO invoice_import
VALUES
  ('0123456789', 'ะ’ะฐัั', 'A-01', '2020-03-16', 1000.00)
, ('9876543210', 'ะŸะตั‚ั', 'A-02', '2020-03-16', 666.00)
, ('0123456789', 'ะ’ะฐัั', 'B-03', '2020-03-16', 9999.00);

ืจืืฉื™ืช, ื‘ื•ืื• ื ื“ื’ื™ืฉ ืืช ื”"ื—ืชื›ื™ื" ืฉืืœื™ื”ื ื”"ืขื•ื‘ื“ื•ืช" ืฉืœื ื• ืžืชื™ื™ื—ืกื•ืช. ื‘ืžืงืจื” ืฉืœื ื•, ื—ืฉื‘ื•ื ื™ื•ืช ืžืชื™ื™ื—ืกื•ืช ืœืœืงื•ื—ื•ืช:

CREATE TEMPORARY TABLE client_import AS
SELECT DISTINCT ON(client_inn)
-- ะผะพะถะฝะพ ะฟั€ะพัั‚ะพ SELECT DISTINCT, ะตัะปะธ ะดะฐะฝะฝั‹ะต ะทะฐะฒะตะดะพะผะพ ะฝะตะฟั€ะพั‚ะธะฒะพั€ะตั‡ะธะฒั‹
  client_inn inn
, client_name "name"
FROM
  invoice_import;

ื›ื“ื™ ืœืฉื™ื™ืš ื ื›ื•ืŸ ื—ืฉื‘ื•ื ื•ืช ืขื ืžื–ื”ื™ ืœืงื•ื—ื•ืช, ืจืืฉื™ืช ืขืœื™ื ื• ืœื‘ืจืจ ืื• ืœื™ืฆื•ืจ ืžื–ื”ื™ื ืืœื”. ื‘ื•ืื• ื ื•ืกื™ืฃ ืฉื“ื•ืช ืžืชื—ืชื:

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

ื”ื‘ื” ื ืฉืชืžืฉ ื‘ืฉื™ื˜ืช ืกื ื›ืจื•ืŸ ื”ื˜ื‘ืœื” ื”ืžืชื•ืืจืช ืœืขื™ืœ ืขื ืชื™ืงื•ืŸ ืงื˜ืŸ - ืœื ื ืขื“ื›ืŸ ืื• ื ืžื—ืง ืฉื•ื ื“ื‘ืจ ื‘ื˜ื‘ืœืช ื”ื™ืขื“, ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžื™ื™ื‘ืื™ื ืœืงื•ื—ื•ืช "ื”ื•ืกืคื” ื‘ืœื‘ื“":

-- ะฟั€ะพัั‚ะฐะฒะปัะตะผ ะฒ ั‚ะฐะฑะปะธั†ะต ะธะผะฟะพั€ั‚ะฐ ID ัƒะถะต ััƒั‰ะตัั‚ะฒัƒัŽั‰ะธั… ะทะฐะฟะธัะตะน
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  client D
WHERE
  T.inn = D.inn; -- unique key

-- ะฒัั‚ะฐะฒะปัะตะผ ะพั‚ััƒั‚ัั‚ะฒะพะฒะฐะฒัˆะธะต ะทะฐะฟะธัะธ ะธ ะฟั€ะพัั‚ะฐะฒะปัะตะผ ะธั… ID
WITH ins AS (
  INSERT INTO client(
    inn
  , name
  )
  SELECT
    inn
  , name
  FROM
    client_import
  WHERE
    client_id IS NULL -- ะตัะปะธ ID ะฝะต ะฟั€ะพัั‚ะฐะฒะธะปัั
  RETURNING *
)
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  ins D
WHERE
  T.inn = D.inn; -- unique key

-- ะฟั€ะพัั‚ะฐะฒะปัะตะผ ID ะบะปะธะตะฝั‚ะพะฒ ัƒ ะทะฐะฟะธัะตะน ัั‡ะตั‚ะพะฒ
UPDATE
  invoice_import T
SET
  client_id = D.client_id
FROM
  client_import D
WHERE
  T.client_inn = D.inn; -- ะฟั€ะธะบะปะฐะดะฝะพะน ะบะปัŽั‡

ืœืžืขืฉื”, ื”ื›ืœ ื‘ืคื ื™ื invoice_import ืขื›ืฉื™ื• ื™ืฉ ืœื ื• ืืช ืฉื“ื” ื™ืฆื™ืจืช ื”ืงืฉืจ ืฉืžื•ืœื client_id, ืื™ืชื” ื ื›ื ื™ืก ืืช ื”ื—ืฉื‘ื•ื ื™ืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”