ื“ื‘ืึท: ืงืึทืžืคึผืึทื˜ื™ื ื˜ืœื™ ืึธืจื’ืึทื ื™ื–ื™ืจืŸ ืกื™ื ื’ืงืจืึทื ืึทื–ื™ื™ืฉืึทื ื– ืื•ืŸ ื™ืžืคึผืึธืจืฅ

ืคึฟืึทืจ ืงืึธืžืคึผืœืขืงืก ืคึผืจืึทืกืขืกื™ื ื’ ืคื•ืŸ ื’ืจื•ื™ืก ื“ืึทื˜ืŸ ืฉื˜ืขืœื˜ (ืคืึทืจืฉื™ื“ืขื ืข ETL ืคึผืจืึทืกืขืกืึทื–: ื™ืžืคึผืึธืจืฅ, ืงืึทื ื•ื•ืขืจื–ืฉืึทื ื– ืื•ืŸ ืกื™ื ื’ืงืจืึทื ืึทื–ื™ื™ืฉืึทืŸ ืžื™ื˜ ืึท ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืžืงื•ืจ) ืึธืคื˜ ืขืก ืื™ื– ืึท ื ื•ื™ื˜ ื˜ืขืžืคึผืขืจืขืจืึทืœื™ "ื’ืขื“ืขื ืงืขืŸ" ืื•ืŸ ืžื™ื“ ื’ืขืฉื•ื•ื™ื ื“ ืคึผืจืึธืฆืขืก ืขืคึผืขืก ื•ื•ืึทืœื•ืžืึทื ืึทืก.

ื ื˜ื™ืคึผื™ืฉ ืึทืจื‘ืขื˜ ืคื•ืŸ ื“ืขื ืžื™ืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืกืึธื•ื ื“ืก ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก: "ื’ืจืื“ ื“ื ืึทืงืึทื•ื ื˜ื™ื ื’ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืึทื ืœืึธื•ื“ืึทื“ ืคื•ืŸ ื“ื™ ืงืœื™ืขื ื˜ ื‘ืึทื ืง ื“ื™ ืœืขืฆื˜ืข ื‘ืืงื•ืžืขืŸ ืคึผื™ื™ืžืึทื ืฅ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ืฆื•ืคึฟืขืœื™ืงืขืจ ื–ื™ื™ ืฆื• ื“ื™ ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ืื•ืŸ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ื–ื™ื™ ืฆื• ื“ื™ื™ืŸ ืึทืงืึทื•ื ืฅ"

ืื‘ืขืจ ื•ื•ืขืŸ ื“ืขืจ ื‘ืึทื ื“ ืคื•ืŸ ื“ืขื "ืขืคึผืขืก" ื”ื™ื™ื‘ื˜ ืฆื• ืžืขืกื˜ืŸ ืื™ืŸ ื”ื•ื ื“ืขืจื˜ืขืจ ืคื•ืŸ ืžืขื’ืื‘ื™ื™ื˜, ืื•ืŸ ื“ื™ ื“ื™ื ืกื˜ ืžื•ื–ืŸ ืคืึธืจื–ืขืฆืŸ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก 24x7, ืคื™ืœืข ื–ื™ื™ึทื˜ ื™ืคืขืงืฅ ืื•ื™ืคืฉื˜ื™ื™ืŸ ื•ื•ืึธืก ื•ื•ืขื˜ ืฆืขืฉื˜ืขืจืŸ ื“ื™ื™ืŸ ืœืขื‘ืŸ.
ื“ื‘ืึท: ืงืึทืžืคึผืึทื˜ื™ื ื˜ืœื™ ืึธืจื’ืึทื ื™ื–ื™ืจืŸ ืกื™ื ื’ืงืจืึทื ืึทื–ื™ื™ืฉืึทื ื– ืื•ืŸ ื™ืžืคึผืึธืจืฅ
ืฆื• ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ื–ื™ื™ ืื™ืŸ 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, ื“ืขืžืึธืœื˜ ืื™ืŸ ื“ื™ ื˜ื™ืฉ / ืื™ื ื“ืขืงืก ืœืœื‘ืขืจ. ืึทืœืข ื“ืขื ืื™ื– ื’ืขื˜ืืŸ ืฆื• ืฉื˜ื™ืฆืŸ ืึทืกื™ื“ ืื•ืŸ ืจื™ื›ื˜ื™ืง ื“ืึทื˜ืŸ ื•ื•ื™ื–ืึทื‘ื™ืœื™ื˜ื™ ืฆื•ื•ื™ืฉืŸ COMMIT'ื ืึทืกื˜ื™ ืื•ืŸ ROLLBACK'ื ื•ืœ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–.

ืึธื‘ืขืจ ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ื“ืึธืก! ืžื™ืจ ื”ืึธื‘ืŸ ื“ื™ ื’ืื ืฆืข ืคึผืจืึธืฆืขืก ืึธื“ืขืจ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื’ืึธืจ ื’ืขืจืึธื˜ืŸ ืึธื“ืขืจ ืขืก ืื™ื– ื ื™ืฉื˜.. ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืขื ื™ืŸ ื•ื•ื™ ืคื™ืœืข ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ - ืžื™ืจ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ "ืคืึธืจื–ืขืฆืŸ ื“ืขื ืคึผืจืึธืฆืขืก ืคื•ืŸ ื“ื™ ืžื™ื˜ืœ," ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ืขืก ืื™ื– ื ื™ืฉื˜ ืงืœืึธืจ ื•ื•ื• ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ.

ืฆื• ื˜ืึธืŸ ื“ืึธืก, ื“ื™ PostgreSQL ื“ืขื•ื•ืขืœืึธืคึผืขืจืก, ืฆื•ืจื™ืง ืื™ืŸ ื•ื•ืขืจืกื™ืข 9.1, ื‘ืึทืงืขื ืขื  ืึทื–ืึท ืึท ื–ืึทืš ื•ื•ื™ UNLOGGED ื˜ื™ืฉืŸ:

ืžื™ื˜ ื“ืขื ืึธื ื•ื•ื™ื™ึทื–, ื“ื™ ื˜ื™ืฉ ืื™ื– ื‘ืืฉืืคืŸ ื•ื•ื™ ืึทื ืœืึธื’ื“. ื“ืึทื˜ืŸ ื’ืขืฉืจื™ื‘ืŸ ืฆื• ืึทื ืœืึธื’ื“ ื˜ื™ืฉืŸ ื˜ืึธืŸ ื ื™ื˜ ื’ื™ื™ืŸ ื“ื•ืจืš ื“ื™ ืฉืจื™ื™ึทื‘ืŸ ืคืึธืจื•ื™ืก ืงืœืึธืฅ (ื–ืขืŸ ื˜ืฉืึทืคึผื˜ืขืจ 29), ื•ื•ืึธืก ื’ืขืคึฟื™ืจื˜ ืึทื–ืึท ื˜ื™ืฉืŸ ืฆื• ืึทืจื‘ืขื˜ ืคื™ืœ ืคืึทืกื˜ืขืจ ื•ื•ื™ ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš. ืึธื‘ืขืจ, ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื™ืžื™ื•ืŸ ืฆื• ื“ื•ืจื›ืคืึทืœ; ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืกืขืจื•ื•ืขืจ ื“ื•ืจื›ืคืึทืœ ืึธื“ืขืจ ื ื•ื™ื˜ืคืึทืœ ืฉืึทื˜ื“ืึทื•ืŸ, ืึท ืึทื ืœืึธื’ื“ ื˜ื™ืฉ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื˜ืจื•ื ืงื™ื™ื˜ื™ื“. ื“ืขืจืฆื•, ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ืึทื ืœืึธื’ื“ ื˜ื™ืฉ ื ื™ื˜ ืจืขืคึผืœื™ืงื™ื™ื˜ื™ื“ ืฆื• ืฉืงืœืึทืฃ ืกืขืจื•ื•ืขืจืก. ืงื™ื™ืŸ ื™ื ื“ืขืงืกื™ื– ื‘ืืฉืืคืŸ ืื•ื™ืฃ ืึท ืึทื ืœืึธื’ื“ ื˜ื™ืฉ ื•ื•ืขืจืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืึทื ืœืึธื’ื“.

ื‘ืงื™ืฆื•ืจ, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคื™ืœ ืคืึทืกื˜ืขืจ, ืึธื‘ืขืจ ืื•ื™ื‘ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืกืขืจื•ื•ืขืจ "ืคืืœื˜", ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคึผืจื™ืงืจืข. ืึธื‘ืขืจ ื•ื•ื™ ืึธืคื˜ ื˜ื•ื˜ ื“ืึธืก ืคึผืึทืกื™ืจืŸ, ืื•ืŸ ื“ื™ื™ืŸ ETL ืคึผืจืึธืฆืขืก ื•ื•ื™ืกืŸ ื•ื•ื™ ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื ืจื™ื›ื˜ื™ืง "ืคื•ืŸ ื“ื™ ืžื™ื˜ืœ" ื ืึธืš "ืจื™ื•ื•ื™ื™ื˜ืึทืœื™ื™ื–ื™ื ื’" ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก?

ืื•ื™ื‘ ื ื™ืฉื˜, ืื•ืŸ ื“ืขืจ ืคืึทืœ ืื•ื™ื‘ืŸ ืื™ื– ืขื ืœืขืš ืฆื• ื“ื™ื™ืŸ, ื ื•ืฆืŸ UNLOGGED, ืึธื‘ืขืจ ืงื™ื™ื ืžืึธืœ ื˜ืึธืŸ ื ื™ื˜ ื’ืขื‘ืŸ ื“ืขื ืึทื˜ืจื™ื‘ื™ื•ื˜ ืื•ื™ืฃ ืคืึทืงื˜ื™ืฉ ื˜ื™ืฉืŸ, ื“ื™ ื“ืึทื˜ืŸ ืคื•ืŸ ื•ื•ืึธืก ืื™ื– ืœื™ื‘ ืฆื• ืื™ืจ.

1.3. ืื•ื™ืฃ ืงืึธืžืžื™ื˜ { ื•ื™ืกืžืขืงืŸ ืจืึธื•ื– | DROP}

ื“ืขื ืงืึทื ืกื˜ืจืึทืงื˜ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืึธื˜ืึทืžืึทื˜ื™ืง ื ืึทื˜ื•ืจ ื•ื•ืขืŸ ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื™ื– ื’ืขืขื ื“ื™ืงื˜ ื•ื•ืขืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ืึท ื˜ื™ืฉ.

ืื•ื™ืฃ 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.

ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืจื˜ืคื!

2. ื•ื•ื™ ืฆื• ืฉืจื™ื™ึทื‘ืŸ?

ื–ืืœ ืžื™ืจ ื ืึธืจ ื–ืึธื’ืŸ - ื ื•ืฆืŸ ืขืก COPY- ืœื•ื™ืคืŸ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ "ืคึผืึทืง" INSERT, ืึทืงืกืขืœืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืžืืœ. ืื™ืจ ืงืขื ืขืŸ ืืคื™ืœื• ื’ืœื™ื™ึทืš ืคึฟื•ืŸ ืึท ืคืึทืจ-ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื˜ืขืงืข.

3. ื•ื•ื™ ืฆื• ืคึผืจืึธืฆืขืก?

ืึทื–ื•ื™, ืœืึธื–ืŸ ืื•ื ื“ื– ืœืึธื–ืŸ ืื•ื ื“ื–ืขืจ ื™ื ื˜ืจืึธื• ืงื•ืง ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก:

  • ืื™ืจ ื”ืึธื‘ืŸ ืึท ื˜ื™ืฉ ืžื™ื˜ ืงืœื™ืขื ื˜ ื“ืึทื˜ืŸ ืกื˜ืึธืจื“ ืื™ืŸ ื“ื™ื™ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก 1 ื ืจืขืงืึธืจื“ืก
  • ื™ืขื“ืขืจ ื˜ืึธื’ ืึท ืงืœื™ืขื ื˜ ืกืขื ื“ื– ืื™ืจ ืึท ื ื™ื™ึทืข ืคื•ืœ "ื‘ื™ืœื“"
  • ืคื•ืŸ ื“ืขืจืคืึทืจื•ื ื’ ืื™ืจ ื•ื•ื™ืกืŸ ืึทื– ืคื•ืŸ ืฆื™ื™ึทื˜ ืฆื• ืฆื™ื™ึทื˜ ื ื™ื˜ ืžืขืจ ื•ื•ื™ 10 ืง ืจืขืงืึธืจื“ืก ื–ืขื ืขืŸ ืคืืจืขื ื“ืขืจื˜

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

3.1. ื’ืึทื ืฅ ืกื™ื ื’ืงืจืึทื ืึทื–ื™ื™ืฉืึทืŸ ืึทืœื’ืขืจื™ื“ืึทื

ืคึฟืึทืจ ืคึผืึทืฉื˜ืขืก, ืœืึธื–ืŸ ืก ื–ืึธื’ืŸ ืึทื– ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ืืคื™ืœื• ื“ืึทืจืคึฟืŸ ืฆื• ืจื™ืกื˜ืจืึทืงื˜ืฉืขืจ ื“ื™ ื“ืึทื˜ืŸ - ื ืึธืจ ื‘ืจืขื ื’ืขืŸ ื“ื™ ื˜ื™ืฉ ืื™ืŸ ื“ืขืจ ื’ืขื•ื•ืืœื˜ ืคืึธืจืขื, ื“ืึธืก ืื™ื–:

  • ืึทืจืึธืคึผื ืขืžืขืŸ ืืœืขืก ื•ื•ืืก ืขืงื–ื™ืกื˜ื™ืจื˜ ืฉื•ื™ืŸ ื ื™ืฉื˜
  • ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ืึทืœืฅ ื•ื•ืึธืก ืฉื•ื™ืŸ ืขืงืกื™ืกื˜ื™ืจื˜ ืื•ืŸ ื“ืึทืจืฃ ื–ื™ื™ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜
  • ืฆื• ื˜ืึธืŸ ืึทืœืฅ ื•ื•ืึธืก ืื™ื– ื ืึธืš ื ื™ืฉื˜ ื’ืขืฉืขืŸ

ืคืืจื•ื•ืืก ื–ืึธืœ ื“ื™ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืื™ืŸ ื“ืขื ืกื“ืจ? ื•ื•ื™ื™ึทืœ ื“ืึธืก ืื™ื– ื•ื•ื™ ื“ื™ ื˜ื™ืฉ ื’ืจื™ื™ืก ื•ื•ืขื˜ ื•ื•ืึทืงืกืŸ ืžื™ื ื™ืžืึทืœ (ื’ืขื“ืขื ืง MVCC!).

ื•ื™ืกืžืขืงืŸ ืคึฟื•ืŸ ื“ืกื˜

ื ื™ื™ืŸ, ื“ืึธืš ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื•ืจืš ื‘ืœื•ื™ื– ืฆื•ื•ื™ื™ ืึทืคึผืขืจื™ื™ืฉืึทื ื–:

  • ืึทืจืึธืคึผื ืขืžืขืŸ (DELETE) ืึทืœืฅ ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ
  • ืฆื• ื˜ืึธืŸ ืึทืœืข ืคึฟื•ืŸ ื“ื™ ื ื™ื™ึทืข ื‘ื™ืœื“

ืึธื‘ืขืจ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜, ื“ืึทื ืง ืฆื• MVCC, ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขื ื˜ื™ืฉ ื•ื•ืขื˜ ืคืึทืจื’ืจืขืกืขืจืŸ ืคึผื•ื ืงื˜ ืฆื•ื•ื™ื™ ืžืึธืœ! ื‘ืึทืงื•ืžืขืŸ +1 ื ื‘ื™ืœื“ืขืจ ืคื•ืŸ ืจืขืงืึธืจื“ืก ืื™ืŸ ืึท ื˜ื™ืฉ ืจืขื›ื˜ ืฆื• ืึท 10 ืง ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ืื™ื– ืึทื–ื•ื™-ืึทื–ื•ื™ ื™ื‘ืขืจื™ืงื™ื™ึทื˜ ...

TRUNCATE dst

ื ืžืขืจ ื™ืงืกืคึผื™ืจื™ืึทื ืกื˜ ื“ืขื•ื•ืขืœืึธืคึผืขืจ ื•ื•ื™ื™ืกื˜ ืึทื– ื“ื™ ื’ืื ืฆืข ื˜ืึทื‘ืœืขื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืœื™ื ื“ ื’ืึทื ืฅ ื‘ื™ืœื™ืง:

  • ืงืœืึธืจ (TRUNCATE) ื“ื™ ื’ืื ืฆืข ื˜ื™ืฉ
  • ืฆื• ื˜ืึธืŸ ืึทืœืข ืคึฟื•ืŸ ื“ื™ ื ื™ื™ึทืข ื‘ื™ืœื“

ื“ืขืจ ืื•ืคึฟืŸ ืื™ื– ืขืคืขืงื˜ื™ื•ื•, ืžืืœ ื’ืึทื ืฅ ืึธื ื•ื•ืขื ื“ืœืขืš, ืึธื‘ืขืจ ืขืก ืื™ื– ืึท ืคึผืจืึธื‘ืœืขื ... ืžื™ืจ ื•ื•ืขืœืŸ ืœื™ื™ื’ืŸ 1M ืจืขืงืึธืจื“ืก ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜, ืึทื–ื•ื™ ืžื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ืคืึทืจื’ื™ื ืขื  ื–ื™ืš ืฆื• ืœืึธื–ืŸ ื“ื™ ื˜ื™ืฉ ืœื™ื™ื“ื™ืง ืคึฟืึทืจ ืึทืœืข ื“ื™ ืฆื™ื™ื˜ (ื•ื•ื™ ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ืึธืŸ ืจืึทืคึผื™ื ื’ ืขืก ืื™ืŸ ืึท ืื™ื™ืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ).

ื•ื•ืืก ืžื™ื™ื ื˜:

  • ืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ืœืึทื ื’-ืคืœื™ืกื ื“ื™ืง ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ
  • TRUNCATE ื™ืžืคึผืึธื•ื–ืึทื– ืึทืงืกืขืก ื•ื™ืกืฉืœื™ืกื™ืง-ื‘ืœืึทืงื™ื ื’
  • ืžื™ืจ ื˜ืึธืŸ ื“ื™ ื™ื ืกืขืจืฉืึทืŸ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜, ืื•ืŸ ืึทืœืขืžืขืŸ ืึทื ื“ืขืจืฉ ืื™ืŸ ื“ืขื ืฆื™ื™ึทื˜ ืงืขืŸ ืืคื™ืœื• ื ื™ืฉื˜ SELECT

ืขืคึผืขืก ื’ื™ื™ื˜ ื ื™ืฉื˜ ื’ื•ื˜...

ื˜ื•ื™ืฉืŸ ื˜ื™ืฉโ€ฆ ืจืขื ืึทืžืขโ€ฆ / ืคืึทืœืŸ ื˜ื™ืฉโ€ฆ

ืึทืŸ ืึธืœื˜ืขืจื ืึทื˜ื™ื•ื• ืื™ื– ืฆื• ืคึผืœืึธืžื‘ื™ืจืŸ ืึทืœืฅ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื ื™ื™ึท ื˜ื™ืฉ, ืื•ืŸ ื“ืขืžืึธืœื˜ ืคืฉื•ื˜ ืจืขื ืึทืžืข ืขืก ืื™ืŸ ืคึผืœืึทืฅ ืคื•ืŸ ื“ื™ ืึทืœื˜. ื ืคึผืึธืจ ืคื•ืŸ ืžื™ืื•ืก ื‘ื™ืกืœ ื–ืื›ืŸ:

  • ื ืึธืš ืื•ื™ืš ืึทืงืกืขืก ื•ื™ืกืฉืœื™ืกื™ืง, ื›ืึธื˜ืฉ ื‘ืื˜ื™ื™ื˜ื™ืง ื•ื•ื™ื™ื ื™ืงืขืจ ืฆื™ื™ึทื˜
  • ืึทืœืข ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– / ืกื˜ืึทื˜ื™ืกื˜ื™ืง ืคึฟืึทืจ ื“ืขื ื˜ื™ืฉ ื–ืขื ืขืŸ ื‘ืึทืฉื˜ืขื˜ื™ืง, ื“ืึทืจืคึฟืŸ ืฆื• ืœื•ื™ืคืŸ ANALYZE
  • ืึทืœืข ืคืจืขืžื“ ืฉืœื™ืกืœืขืŸ ื–ืขื ืขืŸ ืฆืขื‘ืจืื›ืŸ (ืคืง) ืฆื•ื ื˜ื™ืฉ

ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึท WIP ืœืึทื˜ืข ืคื•ืŸ โ€‹โ€‹Simon Riggs ื•ื•ืึธืก ืกืึทื’ื“ื–ืฉืขืกื˜ื™ื“ ืฆื• ืžืึทื›ืŸ 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;

ืื™ืŸ ืกื“ืจ ืฆื• ืจื™ื›ื˜ื™ืง ืคืึทืจื‘ื™ื ื“ืŸ ืึทืงืึทื•ื ืฅ ืžื™ื˜ ืงื•ื ื” IDs, ืžื™ืจ ืขืจืฉื˜ืขืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึธื“ืขืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื“ื™ ื™ื“ืขื ื˜ื™ืคื™ืขืจืก. ืœืึธืžื™ืจ ืœื™ื™ื’ืŸ ืคืขืœื“ืขืจ ืื•ื ื˜ืขืจ ื–ื™ื™:

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’