ืืขืืืื ืืืจืื ืฉื ืืขืจืื ื ืชืื ืื ืืืืืื (ืฉืื ืื
ืืฉืืื ืืืคืืกืืช ืืืกืื ืืื ืืืจื ืืื ื ืฉืืขืช ืืขืจื ืื: "ืืืฉ ืืื
ืืื ืืฉืื ืคื ืฉื ื"ืืฉืื" ืืื ืืชืืื ืืืืืื ืืืืืช ืืื-ืืืื, ืืืฉืืจืืช ืืืื ืืืืฉืื ืืขืืื ืขื ืืกื ืื ืชืื ืื 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 ืืชืจืืฉืช ืคืขืืืื - 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
- ืืขืชืืง ืืจืืจืืช ืืืื, ืืื ืืงืกืื, ืืืืืฆืื,...
ืืื ืืื ืืชื ืฆืจืื ืืืืื ืฉืื ืืชื ืืฆืจืช ืืืื ืืืื ืืื ืขื ืืื ืืงืกืื, ืืื ืืืงื ืืืชืจ ืืื ืืืขืื ืช ืื ืชืื ืืืืืฉืจ ืื ืงืืื ืชืืื ืืื, ืืจืง ืื ืชืืืื ืืช ืืืื ืืงืกืื - ืชืจืื ืืื ืื ืขืืฉื ืืช ืื ืืืืืื
ืืืืคื ืืืื
2. ืืื ืืืชืืื?
ืชื ืื ืจืง ืืืืจ - ืืฉืชืืฉ ืื
-ืืจืืื ืืืงืื "ืืืืื" INSERT
,
3. ืืื ืืขืื?
ืื ืืื ื ืืื ืฉืืืืื ืฉืื ื ื ืจืื ืืขืจื ืื:
- ืืฉ ืื ืืืื ืขื ื ืชืื ื ืืงืื ืืืืืืกื ืื ืืืกื ืื ืชืื ืื ืฉืื 1 ืืืืืื ืฉืืืื
- ืื ืืื ืืงืื ืฉืืื ืื ืืื ืืืฉ "ืชืืื ื" ืืืื
- ืื ืืกืืื ืืชื ืืืืข ืืช ืื ืืื ืคืขื ืื ืืืชืจ ื-10K ืจืฉืืืืช ืืฉืชื ืืช
ืืืืื ืงืืืกืืช ืืืฆื ืืื ืืื
3.1. ืืืืืจืืชื ืกื ืืจืื ืืื
ืืฉื ืืคืฉืืืช, ื ื ืื ืฉืืชื ืืคืืื ืื ืฆืจืื ืืื ืืช ืืืืฉ ืืช ืื ืชืื ืื - ืคืฉืื ืืื ืก ืืช ืืืืื ืืฆืืจื ืืจืฆืืื, ืืืืืจ:
- ืืืกืืจ ืื ืื ืฉืืืจ ืื ืงืืื
- ืขืืืื ืื ืื ืฉืืืจ ืงืืื ืืฆืจืื ืืขืืื
- ืืื ืก ืื ืื ืฉืขืืืื ืื ืงืจื
ืืื ืฆืจืื ืืขืฉืืช ืืช ืืคืขืืืืช ืืกืืจ ืืื? ืื ืืื ืืืื ืืฉืืืื ืืืื ืืื ืืืืืช (
ืืืง ื-dst
ืื, ืืืืื ืฉืืชื ืืืื ืืืกืชืืจ ืขื ืฉืชื ืคืขืืืืช ืืืื:
- ืืืกืืจ (
DELETE
) ืืื ืืืืคื ืืืื - ืืื ืก ืืื ืืืชืืื ื ืืืืฉื
ืืื ืืืงืืื, ืืืืืช ื-MVCC, ืืืื ืืฉืืืื ืืืื ืืืืืง ืคืขืืืื! ืงืืืช +1M ืชืืื ืืช ืฉื ืจืฉืืืืช ืืืืื ืขืงื ืขืืืื ืฉื 10K ืืื ืื ืื ืืชืืจืืช...
TRUNCATE dst
ืืคืชื ืื ืืกื ืืืชืจ ืืืืข ืฉื ืืชื ืื ืงืืช ืืช ืืืืืื ืืืื ืืืื ืืืื:
- ืืจืืจ (
TRUNCATE
) ืื ืืฉืืืื - ืืื ืก ืืื ืืืชืืื ื ืืืืฉื
ืืฉืืื ืืขืืื,
ืืฉืจ ืืืืจ:
- ืื ืื ื ืืชืืืืื ืขืกืงื ืืจืืืช ืฉื ืื
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