DBA: เชธเซเชฎเซ‡เชณ เช…เชจเซ‡ เช†เชฏเชพเชคเชจเซ‡ เชธเช•เซเชทเชฎ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซ‹

เชฎเซ‹เชŸเชพ เชกเซ‡เชŸเชพ เชธเซ‡เชŸเซเชธเชจเซ€ เชœเชŸเชฟเชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ (เช…เชฒเช— ETL เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“: เชฌเชพเชนเซเชฏ เชธเซเชคเซเชฐเซ‹เชค เชธเชพเชฅเซ‡ เช†เชฏเชพเชค, เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ เช…เชจเซ‡ เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เชเซ‡เชถเชจ) เช˜เชฃเซ€เชตเชพเชฐ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช›เซ‡ เช…เชธเซเชฅเชพเชฏเซ€ เชฐเซ‚เชชเซ‡ "เชฏเชพเชฆ เชฐเชพเช–เซ‹" เช…เชจเซ‡ เชคเชฐเชค เชœ เชเชกเชชเชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‹ เช•เช‚เชˆเช• เชชเซเชฐเชšเช‚เชก.

เช† เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เช•เชพเชฐเซเชฏ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เช•เช‚เชˆเช• เชธเช‚เชญเชณเชพเชฏ เช›เซ‡: "เช…เชนเซ€เช‚เชฅเซ€ เช•เซเชฒเชพเชฏเชจเซเชŸ เชฌเซ‡เช‚เช•เชฎเชพเช‚เชฅเซ€ เชเช•เชพเช‰เชจเซเชŸเชฟเช‚เช— เชตเชฟเชญเชพเช— เช…เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡เชฒเซเชฒเซ€ เชชเซเชฐเชพเชชเซเชค เชšเซเช•เชตเชฃเซ€เช“, เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เชเชกเชชเชฅเซ€ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชคเชฎเชพเชฐเชพ เชเช•เชพเช‰เชจเซเชŸเซเชธ เชธเชพเชฅเซ‡ เชฒเชฟเช‚เช• เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡"

เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เช† "เช•เช‚เชˆเช•" เชจเซเช‚ เชตเซ‹เชฒเซเชฏเซเชฎ เชธเซ‡เช‚เช•เชกเซ‹ เชฎเซ‡เช—เชพเชฌเชพเช‡เชŸเซเชธเชฎเชพเช‚ เชฎเชพเชชเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเซ‡เชตเชพเช เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชพเชฅเซ‡ 24x7 เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เชตเซเช‚ เชœเซ‹เชˆเช, เชคเซเชฏเชพเชฐเซ‡ เช˜เชฃเซ€ เช†เชกเช…เชธเชฐเซ‹ เชŠเชญเซ€ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡ เชคเชฎเชพเชฐเซเช‚ เชœเซ€เชตเชจ เชฌเช—เชพเชกเซ‡ เช›เซ‡.
DBA: เชธเซเชฎเซ‡เชณ เช…เชจเซ‡ เช†เชฏเชพเชคเชจเซ‡ เชธเช•เซเชทเชฎ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซ‹
PostgreSQL เชฎเชพเช‚ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ (เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชคเซ‡เชฎเชพเช‚ เชœ เชจเชนเซ€เช‚), เชคเชฎเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ เชคเชฎเชจเซ‡ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซ เชชเชฐ เชเชกเชชเชฅเซ€ เช…เชจเซ‡ เช“เช›เชพ เชธเช‚เชธเชพเชงเชจ เชตเชชเชฐเชพเชถ เชธเชพเชฅเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชถเซ‡.

1. เช•เซเชฏเชพเช‚ เชฎเซ‹เช•เชฒเชตเซเช‚?

เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เชจเช•เซเช•เซ€ เช•เชฐเซ€เช เช•เซ‡ เช†เชชเชฃเซ‡ "เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ" เช•เชฐเชตเชพ เชฎเชพเช—เซ€เช เช›เซ€เช เชคเซ‡ เชกเซ‡เชŸเชพ เช•เซเชฏเชพเช‚ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ€เช.

1.1. เช…เชธเซเชฅเชพเชฏเซ€ เช•เซ‹เชทเซเชŸเช•เซ‹ (เช…เชธเซเชฅเชพเชฏเซ€ เช•เซ‹เชทเซเชŸเช•)

เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, 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? ..

เช…เชฅเชตเชพ เชกเซ‡เชŸเชพ เชซเซเชฒเซ‹ เชเชŸเชฒเซ‹ เชฎเซ‹เชŸเซ‹ เช›เซ‡ เช•เซ‡ เชเช• เช•เชจเซ‡เช•เซเชถเชจ เชชเชฐ เชชเซ‚เชฐเชคเซ€ เชฌเซ‡เชจเซเชกเชตเชฟเชกเซเชฅ เชจเชฅเซ€ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚เชฅเซ€ (เชตเชพเช‚เชšเซ‹, CPU เชฆเซ€เช  เชเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ)?..

เช…เชฅเชตเชพ เช…เชฎเซเช• เช•เชพเชฎเช—เซ€เชฐเซ€ เชšเชพเชฒเซ€ เชฐเชนเซ€ เช›เซ‡ เช…เชธเซเชฎเซ‡เชณ เชฐเซ€เชคเซ‡ เชตเชฟเชตเชฟเชง เชœเซ‹เชกเชพเชฃเซ‹เชฎเชพเช‚? ..

เช…เชนเซ€เช‚ เชซเช•เซเชค เชเช• เชœ เชตเชฟเช•เชฒเซเชช เช›เซ‡ - เช…เชธเซเชฅเชพเชฏเซ€ เชฐเซ‚เชชเซ‡ เชฌเชฟเชจ-เช…เชธเซเชฅเชพเชฏเซ€ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซ‹. เชชเชจ, เชนเชพ. เชคเซ‡ เชœ:

  • เชฎเชนเชคเซเชคเชฎ เชฐเซ‡เชจเซเชกเชฎ เชจเชพเชฎเซ‹ เชธเชพเชฅเซ‡ "เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ" เช•เซ‹เชทเซเชŸเช•เซ‹ เชฌเชจเชพเชตเซเชฏเชพเช‚ เชœเซ‡เชฅเซ€ เช•เซ‹เชˆเชจเซ€ เชธเชพเชฅเซ‡ เช›เซ‡เชฆเชพเชฏ เชจเชนเซ€เช‚
  • เช…เชฐเซเช•: เชคเซ‡เชฎเชจเซ‡ เชฌเชพเชนเซเชฏ เชธเซเชคเซเชฐเซ‹เชคเชจเชพ เชกเซ‡เชŸเชพเชฅเซ€ เชญเชฐเซเชฏเชพ
  • เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ: เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค, เช•เซ€ เชฒเชฟเช‚เช•เชฟเช‚เช— เชซเซ€เชฒเซเชกเซเชธเชฎเชพเช‚ เชญเชฐเซ‡เชฒ
  • เชฒเซ‹เชก: เชฒเช•เซเชทเซเชฏ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚ เชคเซˆเชฏเชพเชฐ เชกเซ‡เชŸเชพ เชฐเซ‡เชกเซเชฏเซ‹
  • "เชฎเชพเชฐเชพ" เช•เซ‹เชทเซเชŸเช•เซ‹ เช•เชพเชขเซ€ เชจเชพเช–เซเชฏเชพ

เช…เชจเซ‡ เชนเชตเซ‡ - เชฎเชฒเชฎ เชฎเชพเช‚ เชซเซเชฒเชพเชฏ. เชนเช•เชฟเช•เชคเชฎเชพเช‚, PostgreSQL เชฎเชพเช‚ เชฌเชงเชพ เชฒเช–เซ‡ เช›เซ‡ เชคเซ‡ เชฌเซ‡ เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡ - WAL เชฎเชพเช‚ เชชเซเชฐเชฅเชฎ, เชชเช›เซ€ เชŸเซ‡เชฌเชฒ/เช‡เชจเซเชกเซ‡เช•เซเชธ เชฌเซ‹เชกเซ€เชฎเชพเช‚. เช† เชฌเชงเซเช‚ ACID เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชตเชšเซเชšเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€เชจเซ€ เชฏเซ‹เช—เซเชฏเชคเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ COMMIT'เชฎเซ€เช‚เชœเชตเชพเชณเซเช‚ เช…เชจเซ‡ ROLLBACK'เชจเชฒ เชตเซเชฏเชตเชนเชพเชฐเซ‹.

เชชเชฐเช‚เชคเซ เช…เชฎเชจเซ‡ เช†เชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€! เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช†เช–เซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช›เซ‡ เช•เชพเช‚ เชคเซ‹ เชคเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชธเชซเชณ เชนเชคเซเช‚ เช…เชฅเชตเชพ เชคเซ‡ เชจ เชนเชคเซเช‚.. เช•เซ‡เชŸเชฒเชพ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชนเชถเซ‡ เชคเซ‡เชจเชพเชฅเซ€ เช•เซ‹เชˆ เชซเชฐเช• เชชเชกเชคเซ‹ เชจเชฅเซ€ - เช…เชฎเชจเซ‡ "เชฎเชงเซเชฏเชฎเชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชšเชพเชฒเซ เชฐเชพเช–เชตเชพเชฎเชพเช‚" เชฐเชธ เชจเชฅเซ€, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชธเซเชชเชทเซเชŸ เชจ เชนเซ‹เชฏ เช•เซ‡ เชคเซ‡ เช•เซเชฏเชพเช‚ เชนเชคเซเช‚.

เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, PostgreSQL เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช, เช†เชตเซƒเชคเซเชคเชฟ 9.1 เชฎเชพเช‚, เช†เชตเซ€ เชตเชธเซเชคเซ เชฐเชœเซ‚ เช•เชฐเซ€ เช…เชจเชฒเซ‰เช— เช•เชฐเซ‡เชฒ เช•เซ‹เชทเซเชŸเช•เซ‹:

เช† เชธเช‚เช•เซ‡เชค เชธเชพเชฅเซ‡, เชŸเซ‡เชฌเชฒ เช…เชจเชฒเซ‹เช— เช•เชฐเซ‡เชฒ เชคเชฐเซ€เช•เซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชจเชฒเซ‰เช— เช•เชฐเซ‡เชฒเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชชเชฐ เชฒเช–เชพเชฏเซ‡เชฒ เชกเซ‡เชŸเชพ เชฒเช–เชพเชฃ-เช†เช—เชณเชจเชพ เชฒเซ‹เช—เชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชคเซ‹ เชจเชฅเซ€ (เชœเซเช“ เชชเซเชฐเช•เชฐเชฃ 29), เชœเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เช†เชตเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชธเชพเชฎเชพเชจเซเชฏ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชเชกเชชเชฅเซ€ เช•เชพเชฎ เช•เชฐเซ‹. เชœเซ‹ เช•เซ‡, เชคเซ‡เช“ เชจเชฟเชทเซเชซเชณเชคเชพ เชฎเชพเชŸเซ‡ เชฐเซ‹เช—เชชเซเชฐเชคเชฟเช•เชพเชฐเช• เชจเชฅเซ€; เชธเชฐเซเชตเชฐ เชจเชฟเชทเซเชซเชณเชคเชพ เช…เชฅเชตเชพ เช•เชŸเซ‹เช•เชŸเซ€ เชถเชŸเชกเชพเช‰เชจเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชจเชฒเซ‹เช— เชฅเชฏเซ‡เชฒ เชŸเซ‡เชฌเชฒ เช†เชชเชฎเซ‡เชณเซ‡ เช•เชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, เช…เชจเชฒเซ‹เช— เช•เชฐเซ‡เชฒ เช•เซ‹เชทเซเชŸเช•เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เช“ เชจเช•เชฒ เชจเชฅเซ€ เชธเชฐเซเชตเชฐเซ‹เชจเซ‡ เช—เซเชฒเชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡. เช…เชจเชฒเซ‹เช— เช•เชฐเซ‡เชฒ เชŸเซ‡เชฌเชฒ เชชเชฐ เชฌเชจเชพเชตเซ‡เชฒ เช•เซ‹เชˆเชชเชฃ เชˆเชจเซเชกเซ‡เช•เซเชธ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชจเชฒเซ‹เช— เชฅเชˆ เชœเชพเชฏ เช›เซ‡.

เชŸเซ‚เช‚เช•เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เชคเซ‡ เช–เซ‚เชฌ เชเชกเชชเซ€ เชนเชถเซ‡, เชชเชฐเช‚เชคเซ เชœเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชฐเซเชตเชฐ "เชชเชกเซ‡", เชคเซ‹ เชคเซ‡ เช…เชชเซเชฐเชฟเชฏ เชนเชถเซ‡. เชชเชฐเช‚เชคเซ เช† เช•เซ‡เชŸเชฒเซ€ เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชถเซเช‚ เชคเชฎเชพเชฐเซ€ ETL เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชœเชพเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ‡ "เชชเซเชจเชฐเซเชœเซ€เชตเชฟเชค" เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชคเซ‡เชจเซ‡ "เชฎเชงเซเชฏเชฎเชฅเซ€" เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชธเซเชงเชพเชฐเชตเซเช‚?...

เชœเซ‹ เชจเชนเซ€เช‚, เช…เชจเซ‡ เช‰เชชเชฐเชจเซ‹ เช•เซ‡เชธ เชคเชฎเชพเชฐเชพ เชœเซ‡เชตเซ‹ เชœ เช›เซ‡, เชคเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ UNLOGGEDเชชเชฐเช‚เชคเซ เช•เซเชฏเชพเชฐเซ‡เชฏ เชจเชนเซ€เช‚ เชตเชพเชธเซเชคเชตเชฟเช• เช•เซ‹เชทเซเชŸเช•เซ‹ เชชเชฐ เช† เชฒเช•เซเชทเชฃเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชคเชฎเชจเซ‡ เชชเซเชฐเชฟเชฏ เช›เซ‡.

1.3. เช•เชฎเซ€เชŸ เชชเชฐ { เชชเช‚เช•เซเชคเชฟเช“ เช•เชพเชขเซ€ เชจเชพเช–เซ‹ | เชกเซเชฐเซ‹เชช}

เชœเซเชฏเชพเชฐเซ‡ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เช† เชฐเชšเชจเชพ เชคเชฎเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เชตเชฐเซเชคเชฃเซ‚เช•เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชชเชฐ 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. เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเซ€?

เชคเซ‹, เชšเชพเชฒเซ‹ เช†เชชเชฃเซ‹ เชชเชฐเชฟเชšเชฏ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซ‹ เชœเซ‹เชˆเช:

  • เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชคเชฎเชพเชฐเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เซเชฒเชพเชฏเช‚เชŸ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡เชจเซเช‚ เชŸเซ‡เชฌเชฒ เช›เซ‡ 1M เชฐเซ‡เช•เซ‹เชฐเซเชก
  • เชฆเชฐเชฐเซ‹เชœ เช—เซเชฐเชพเชนเช• เชคเชฎเชจเซ‡ เชเช• เชจเชตเซเช‚ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ "เช›เชฌเซ€"
  • เช…เชจเซเชญเชต เชชเชฐเชฅเซ€ เชคเชฎเซ‡ เชœเชพเชฃเซ‹ เช›เซ‹ เช•เซ‡ เชธเชฎเชฏ เชธเชฎเชฏ เชชเชฐ 10K เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชฌเชฆเชฒเชพเชคเชพ เชจเชฅเซ€

เช†เชตเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซเช‚ เช‰เชคเซเชคเชฎ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ KLADR เช†เชงเชพเชฐ โ€” เช•เซเชฒ เชฎเชณเซ€เชจเซ‡ เช˜เชฃเชพเช‚ เชฌเชงเชพเช‚ เชธเชฐเชจเชพเชฎเชพเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฆเชฐเซ‡เช• เชธเชพเชชเซเชคเชพเชนเชฟเช• เช…เชชเชฒเซ‹เชกเชฎเชพเช‚ เชฐเชพเชทเซเชŸเซเชฐเซ€เชฏ เชธเซเชคเชฐเซ‡ เชชเชฃ เชฌเชนเซ เช“เช›เชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ (เชตเชธเชพเชนเชคเซ‹เชจเซเช‚ เชจเชพเชฎ เชฌเชฆเชฒเชตเซเช‚, เชถเซ‡เชฐเซ€เช“เชจเซเช‚ เชธเช‚เชฏเซ‹เชœเชจ, เชจเชตเชพ เชฎเช•เชพเชจเซ‹เชจเซ‹ เชฆเซ‡เช–เชพเชต) เชœเซ‹เชตเชพ เชฎเชณเซ‡ เช›เซ‡.

3.1. เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เชเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เชธเชฐเชณเชคเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชกเซ‡เชŸเชพเชจเซเช‚ เชชเซเชจเชฐเซเช—เช เชจ เช•เชฐเชตเชพเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ - เชซเช•เซเชค เชŸเซ‡เชฌเชฒเชจเซ‡ เช‡เชšเซเช›เชฟเชค เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชฒเชพเชตเซ‹, เชเชŸเชฒเซ‡ เช•เซ‡:

  • เชฆเซ‚เชฐ เช•เชฐเซ‹ เชฌเชงเซเช‚ เชœเซ‡ เชนเชตเซ‡ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชจเชฅเซ€
  • เช…เชชเชกเซ‡เชŸ เชชเชนเซ‡เชฒเชพเชฅเซ€ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡ เช…เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เชฌเชงเซเช‚
  • เชฆเชพเช–เชฒ เช•เชฐเซ‹ เชฌเชงเซเช‚ เชœเซ‡ เชนเชœเซ เชธเซเชงเซ€ เชฅเชฏเซเช‚ เชจเชฅเซ€

เช† เช•เซเชฐเชฎเชฎเชพเช‚ เช•เชพเชฎเช—เซ€เชฐเซ€ เชถเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช? เช•เชพเชฐเชฃ เช•เซ‡ เช† เชฐเซ€เชคเซ‡ เชŸเซ‡เชฌเชฒเชจเซเช‚ เช•เชฆ เชจเซเชฏเซ‚เชจเชคเชฎ เชตเชงเชถเซ‡ (MVCC เชฏเชพเชฆ เชฐเชพเช–เซ‹!).

dst เชฅเซ€ เช•เชพเชขเซ€ เชจเชพเช–เซ‹

เชจเชพ, เช…เชฒเชฌเชคเซเชค เชคเชฎเซ‡ เชฎเชพเชคเซเชฐ เชฌเซ‡ เช“เชชเชฐเซ‡เชถเชจ เชฆเซเชตเชพเชฐเชพ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹:

  • เชฆเซ‚เชฐ เช•เชฐเซ‹ (DELETE) เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฌเชงเซเช‚
  • เชฆเชพเช–เชฒ เช•เชฐเซ‹ เชฌเชงเซ€ เชจเชตเซ€ เช›เชฌเซ€เชฎเชพเช‚เชฅเซ€

เชชเชฐเช‚เชคเซ เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, MVCC เชจเซ‹ เช†เชญเชพเชฐ, เชŸเซ‡เชฌเชฒเชจเซเช‚ เช•เชฆ เชฌเชฐเชพเชฌเชฐ เชฌเชฎเชฃเซเช‚ เชตเชงเชถเซ‡! 1K เช…เชชเชกเซ‡เชŸเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชจเซ€ +10M เช›เชฌเซ€เช“ เชฎเซ‡เชณเชตเชตเซ€ เช–เซ‚เชฌ เชœ เชฐเซ€เชกเชจเซเชกเชจเซเชธเซ€ เช›เซ‡...

TRUNCATE เชคเชพ

เชตเชงเซ เช…เชจเซเชญเชตเซ€ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เชœเชพเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชธเชฎเช—เซเชฐ เชŸเซ‡เชฌเซเชฒเซ‡เชŸ เชคเชฆเซเชฆเชจ เชธเชธเซเชคเซ€ เชฐเซ€เชคเซ‡ เชธเชพเชซ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

  • เชšเซ‹เช–เซเช–เซ (TRUNCATE) เชธเชฎเช—เซเชฐ เชŸเซ‡เชฌเชฒ
  • เชฆเชพเช–เชฒ เช•เชฐเซ‹ เชฌเชงเซ€ เชจเชตเซ€ เช›เชฌเซ€เชฎเชพเช‚เชฅเซ€

เชชเชฆเซเชงเชคเชฟ เช…เชธเชฐเช•เชพเชฐเช• เช›เซ‡, เช•เซเชฏเชพเชฐเซ‡เช• เชคเชฆเซเชฆเชจ เชฒเชพเช—เซ เชชเชกเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชเช• เชธเชฎเชธเซเชฏเชพ เช›เซ‡... เช…เชฎเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชฎเชพเชŸเซ‡ 1M เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชŸเซ‡เชฌเชฒเชจเซ‡ เช†เชŸเชฒเชพ เชธเชฎเชฏ เชฎเชพเชŸเซ‡ เช–เชพเชฒเซ€ เชฐเชพเช–เชตเชพเชจเซเช‚ เชชเชฐเชตเชกเซ€ เชถเช•เซ€เช เชจเชนเซ€เช‚ (เชœเซ‡เชฎ เช•เซ‡ เชคเซ‡เชจเซ‡ เชเช• เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชฒเชชเซ‡เชŸเซ€ เชฒเซ€เชงเชพ เชตเชฟเชจเชพ เชฅเชถเซ‡).

เชฎเชคเชฒเชฌ เช•เซ‡:

  • เช…เชฎเซ‡ เชถเชฐเซ‚ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชšเชพเชฒเชคเซ‹ เชตเซเชฏเชตเชนเชพเชฐ
  • TRUNCATE เชฒเชพเชฆเซ‡ เช›เซ‡ เชเช•เซเชธเซ‡เชธ เชเช•เซเชธเช•เซเชฒเซเชเชฟเชต- เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเชตเซเช‚
  • เช…เชฎเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ€ เชจเชฟเชตเซ‡เชถ เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เช† เชธเชฎเชฏเซ‡ เชฌเซ€เชœเชพ เชฌเชงเชพ เชชเชฃ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ SELECT

เช•เช‚เชˆเช• เชธเชพเชฐเซเช‚ เชจเชฅเซ€ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซเช‚...

เชŸเซ‡เชฌเชฒ เชฌเชฆเชฒเซ‹... เชจเชพเชฎ เชฌเชฆเชฒเซ‹... / เชŸเซ‡เชฌเชฒ เช›เซ‹เชกเซ‹...

เชเช• เชตเชฟเช•เชฒเซเชช เช เช›เซ‡ เช•เซ‡ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‡ เชเช• เช…เชฒเช— เชจเชตเชพ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เชญเชฐเซ‹, เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชœเซ‚เชจเชพเชจเซ€ เชœเช—เซเชฏเชพเช เชซเช•เซเชค เชจเชพเชฎ เช†เชชเซ‹. เชฌเซ‡ เชฌเซ€เชญเชคเซเชธ เชจเชพเชจเซ€ เชตเชธเซเชคเซเช“:

  • เชนเชœเซ เชชเชฃ เชเช•เซเชธเซ‡เชธ เชเช•เซเชธเช•เซเชฒเซเชเชฟเชต, เชœเซ‹เช•เซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช“เช›เซ‹ เชธเชฎเชฏ
  • เช† เช•เซ‹เชทเซเชŸเช• เชฎเชพเชŸเซ‡เชจเซ€ เชคเชฎเชพเชฎ เช•เซเชตเซ‡เชฐเซ€ เชฏเซ‹เชœเชจเชพเช“/เช†เช‚เช•เชกเชพเช“ เชฐเซ€เชธเซ‡เชŸ เช›เซ‡, ANALYZE เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡
  • เชฌเชงเซ€ เชตเชฟเชฆเซ‡เชถเซ€ เชšเชพเชตเซ€เช“ เชคเซ‚เชŸเซ€ เช—เชˆ เช›เซ‡ (FK) เชŸเซ‡เชฌเชฒ เชชเชฐ

เชธเชฟเชฎเซ‹เชจ เชฐเชฟเช—เซเชธเชจเซ‹ WIP เชชเซ‡เชš เชนเชคเซ‹ เชœเซ‡เชฃเซ‡ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเซเชฏเซเช‚ เชนเชคเซเช‚ ALTER-เช†เช‚เช•เชกเชพ เช…เชจเซ‡ เชเชซเช•เซ‡เชจเซ‡ เชธเซเชชเชฐเซเชถเซเชฏเชพ เชตเชฟเชจเชพ, เชซเชพเช‡เชฒ เชธเซเชคเชฐเซ‡ เชŸเซ‡เชฌเชฒ เชฌเซ‹เชกเซ€เชจเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€, เชชเชฐเช‚เชคเซ เช•เซ‹เชฐเชฎ เชเช•เชคเซเชฐเชฟเชค เชฅเชฏเซ‹ เชจ เชนเชคเซ‹.

เช•เชพเชขเซ€ เชจเชพเช–เซ‹, เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹, เชฆเชพเช–เชฒ เช•เชฐเซ‹

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เชคเซเชฐเชฃ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเชพ เชจเซ‹เชจ-เชฌเซเชฒเซ‹เช•เซ€เช‚เช— เชตเชฟเช•เชฒเซเชช เชชเชฐ เชชเชคเชพเชตเชŸ เช•เชฐเซ€เช เช›เซ€เช. เชฒเช—เชญเช— เชคเซเชฐเชฃ... เช† เชธเซŒเชฅเซ€ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚?

-- ะฒัะต ะดะตะปะฐะตะผ ะฒ ั€ะฐะผะบะฐั… ั‚ั€ะฐะฝะทะฐะบั†ะธะธ, ั‡ั‚ะพะฑั‹ ะฝะธะบั‚ะพ ะฝะต ะฒะธะดะตะป "ะฟั€ะพะผะตะถัƒั‚ะพั‡ะฝั‹ั…" ัะพัั‚ะพัะฝะธะน
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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹