ááŒá®ážáá¬ážáá±á¬áá±áá¬á¡á
á¯á¶áá»á¬ážá ááŸá¯ááºááœá±ážáá±á¬áá¯ááºáá±á¬ááºááŸá¯á¡ááœáẠ(ááœá²ááŒá¬ážáááºá
á€áá²á·ááá¯á·áá±á¬ áá¬áá¬ááºá¡áá¯ááºáá
áºáá¯ááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº á€áá²á·ááá¯á·áá±á¬ á¡áá¶áá»áá¯ážááŒá
áºáááº- âáá®ááŸá¬
ááá¯á·áá±á¬áº ဠâáá
áºá
á¯á¶áá
áºáá¯â á áá¯áááºááẠáá¬ááŸáá·áºáá»á®áá±á¬ megabytes ááŒáá·áº á
áááºááá¯ááºážáá¬áá±á¬á¡áá«á áááºáá±á¬ááºááŸá¯ááẠáá±áá¬áá±á·á
Ạ24x7 ááŒáá·áº áááºáááºá¡áá¯ááºáá¯ááºááááºááŒá
áºááŒá®ážá ááá·áºááááᯠáá»ááºá
á®ážá
á±ááá·áº áá±ážááœááºááá¯ážáá»áá¯ážáá»á¬ážá
áœá¬ áá±á«áºáá±á«ááºáá¬áááºá
áááºážááá¯á·ááᯠPostgreSQL ááœáẠááá¯ááºááœááºááŒá±ááŸááºážááẠ(ááá¯á·á¡ááŒáẠáááºážááœááºáá¬áá)á á¡áá¬á¡á¬ážáá¯á¶ážááᯠááá¯ááá¯ááŒááºáááºá
áœá¬ áá¯ááºáá±á¬ááºááá¯ááºááŒá®áž á¡áááºážá¡ááŒá
áºáá¯á¶ážá
áœá²ááŸá¯áááºážáááŒáá·áº ááá·áºá¡á¬áž ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºáá¯ááºáá±á¬ááºááá¯ááºá
á±ááá·áº á¡áá»áá¯á·áá±á¬ optimizations áá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
1. áááºááᯠááá¯á·áááá²á
áŠážá áœá¬á áá»áœááºá¯ááºááá¯á· "á á®áá¶áá±á¬ááºááœááºááá¯áá±á¬ áá±áá¬ááᯠáááºááá·áºáá±áá¬ááœáẠá¡ááºáá¯ááºáááºááá¯ááºáááºááᯠáá¯á¶ážááŒááºááŒáá«á áá¯á·á
á.áá áá¬áá®á á¬ážááœá²áá»á¬áž (TEMPORARY TABLE)
áá°á¡áá PostgreSQL á¡ááœáẠáá¬áá®ááá¬ážáá»á¬ážááẠá¡ááŒá¬ážáááºááá·áºá¡áá¬áá»á¬ážááŸáá·áº á¡áá°áá°áááºááŒá áºáá«áááºá ááá¯á·ááŒá±á¬áá·áº á¡áá°áá®ážááŸá¯ ááŒáá¯ááºáááºá âá¡áá¬áá¬ááá¯ááºážááᯠááŸááºáá¬ááºáá²ááŸá¬áᬠááááºážáááºážáá¬ážááŒá®áž á¡áá¯á¶ážáááºááá¯ááºááŸá¬áá«â. áá«áá±ááá·áº áááá¬áááºááŸá¬ážáá²á· ááœá²ááŒá¬ážááŸá¯ááœá±áááºáž ááŸááá«áááºá
áá±áá¬áá±á·á áºááá¯á·áá»áááºáááºááŸá¯áá áºáá¯á á®á¡ááœáẠáááºáááá¯ááºááá¯áẠânamespaceâ
áá»áááºáááºááŸá¯ááŸá
áºáá¯ááᯠáá
áºááŒáá¯ááºáááºáááºáž áá»áááºáááºááá¯á· ááŒáá¯ážá
á¬ážáá«á 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 ááẠáááááá¬áᬠááá¯ááŒááºáá«áááºá
ááá¯á·áá±á¬áº áá¬áá®ááá¬ážááẠâáá¬áááºáá®ážáá«ážâ ááá¬ážááŒá áºáá±áá±ážáá±á¬ááŒá±á¬áá·áº áááºážááᯠáá¯á¶áá°áá áºáá¯áá±á«áºááœáẠáááºáá®ážáááááá¯ááºáá«á á¡áááºážáá¯á¶ážá áááºááá¯ááºáᬠpatch ááẠá¡áá»áááºááŒá¬ááŒáá·áºá áœá¬ áá»á¶á·ááŸá¶á·áá±áá±á¬áºáááºážá
á.áá ááŒá¯ááºáá¬ážáá±á¬ ááá¬áž
ááá¯á·áá±á¬áº á¥ááá¬á¡á¬ážááŒáá·áºá ááá·áºááœáẠááœá±áá±ážááœá±áá°áá áºáá¯á¡ááœááºáž á¡áá±á¬ááºá¡áááºááá±á¬áºááá¯ááºáá±á¬ áááºáá²áá±á¬ ETL áá¯ááºáááºážá ááºá¡áá»áá¯á·ááŸááá±áá«á áááºáá¬áá¯ááºááá·áºáááºá ááá¯á·áá±á¬áº ááá·áºááœááºááŸááá±áá±ážááẠááœá±áá±ážááœá±áá°áá¯ááºááœáẠpgbouncer? ..
áá«ááŸááá¯áẠáá±áá¬á á®ážáááºážááŸá¯á á¡áááºážááŒá®ážáááºá áá»áááºáááºááŸá¯áá áºáá¯ááœáẠáá¯á¶áá±á¬ááºáá±á¬ bandwidth áááŸááá«á áá±áá¬áá±á·á áºáá áºáá¯á០(áááºáá«á CPU áá áºáá¯áá»áŸáẠáá¯ááºáááºážá ááºáá áºáá¯)á á
ááá¯á·ááá¯áẠá¡áá»áá¯á·áá±á¬ áá¯ááºáááºážáá»á¬áž áááºáááºáá¯ááºáá±á¬ááºáá±áá«áááºá áááŒáá¯ááºáááºáááºáž áá»áááºáááºááŸá¯ á¡áá»áá¯ážáá»áá¯ážááŸá¬..
áá®áá±áá¬ááŸá¬ ááœá±ážáá»ááºá áá¬áá áºáá¯áá² ááŸááá«áááº- áá¬áá®ááá¯ááºáá±á¬ ááá¬ážáá áºáá¯ááᯠáá¬áá®áááºáá®ážáá«á. Pun áá¯ááºááẠá¡á²áá«ááá±á¬á·-
- áááºáá°á·ááá¯áá»áŸ áááááá á±áááºá¡ááœáẠá¡áá»á¬ážáá¯á¶ážáá»áááºážá¡áááºáá»á¬ážááŒáá·áº "áá»áœááºá¯ááºáááá¯ááºááá¯ááº" ááá¬ážáá»á¬ážááᯠáááºáá®ážáá²á·áááºá
- áá¯ááºáá°: ááŒááºáá¡áááºážá¡ááŒá áºáá áºáá¯á០áá±áá¬áá»á¬ážááŒáá·áº áááºážááá¯á·ááᯠááŒáá·áºááœááºážáá²á·áááºá
- Transform: converted, áá±á¬á·ááá·áºááºá¡ááœááºáá»á¬ážááŒáá·áº
- áááº: á¡áááºááá·áºáá±áá¬ááᯠáá áºááŸááºááá¬ážáá»á¬ážáá²ááá¯á· áá±á¬ááºážááá·áºáááºá
- "áá»áœááºá¯ááºá" ááá¬ážáá»á¬ážááᯠáá»ááºááá¯ááºáááºá
ááá¯áááºáž - áá¶á·áá¬áá®á áááºáá±á¬ááºá ááááºáá±á¬á·, PostgreSQL ááœáẠáá±ážááá»áŸááẠááŸá
áºááŒááẠááŒá
áºáá»ááºáááºá - COMMIT
'á¡ááá¯ááºá
á¬ážáá²á· ROLLBACK
' null á¡áá±á¬ááºážá¡áááºá
áá«áá±ááá·áº áá«ááá¯á· áá«ááᯠáááá¯á¡ááºáá°áž! áá»áœááºá¯ááºááá¯á·ááœáẠáá¯ááºáááºážá ááºáá áºáá¯áá¯á¶ážááŸááááºá áá¯á¶ážáá¡á±á¬ááºááŒááºáááºááŒá áºá á± áá¡á±á¬ááºááŒááºáááºááŒá áºá á±á. ááŒá¬ážáá¶ááœá±áá±ážááœá±áá° áááºáá»áŸááŸááááºááᯠá¡áá±ážáááŒá®ážáá« - á¡áá°ážáááŒáá·áº áááºážááẠáááºááá·áºáá±áá¬ááœáẠááŸááá±áááºááᯠáááŸááºážááááºážááŒá áºáá±áá±á¬á¡áá« "á¡áááºá០áá¯ááºáááºážá ááºááᯠáááºáááºáá¯ááºáá±á¬ááºáááº" ááᯠáá»áœááºá¯ááºááá¯á· á áááºááááºá á¬ážáá«á
áá«ááá¯áá¯ááºááá¯á·á áá¬ážááŸááºáž 9.1 ááŸá¬ááŒááºááŒá
áºáá²á· PostgreSQL developer ááœá±á áá®ááá¯á¡áá¬áá
áºáá¯ááᯠááááºáááºáá±ážáá²á·áá«áááºá
á€ááœáŸááºááŒáá»ááºááŒáá·áºá ááá¬ážááᯠáá±á¬á·ááºááá»áá¬ážááá·áºá¡ááŒá Ạáááºáá®ážáá¬ážáááºá áá±á¬á·ááºááá¬ážáá±á¬ ááá¬ážáá»á¬ážááœáẠáá±ážáá¬ážáá±á¬ áá±áá¬ááẠáá±ážááŸááºáá¬ážáá±á¬ ááŸááºáááºáž (á¡áááºáž áá ááᯠááŒáá·áºáá«) ááŸáááá·áº áááœá¬ážáá² ááá¯ááá¬ážáá»á¬ážááᯠááŒá áºáá±á«áºá á±áááºá á¡áá¯ááºá áá¯á¶ááŸááºááẠá¡áá»á¬ážááŒá®áž ááá¯ááŒááºáááºá. ááá¯á·áá¬ááœááºá áááºážááá¯á·ááẠáá»ááŸá¯á¶ážááŸá¯ááᯠáá¯áá¶ááá¯ááºá áœááºážáááŸááá±á áá¬áá¬áá»áá¯á·ááœááºážááŸá¯ ááá¯á·ááá¯áẠá¡áá±ážáá±á«áºááááºááŒááºážááá á¹á ááœááºá áá±á¬á·ááºááá¬ážáá±á¬ááá¬áž á¡ááá¯á¡áá»á±á¬ááºááŒááºáá±á¬ááºáááºá. ááá¯á·á¡ááŒááºá unlogged table áá¡ááŒá±á¬ááºážá¡áá¬áá»á¬áž áá¯á¶áá°áá°ážááá¬ážáá«á áá»áœááºáá¬áá¬áá»á¬ážáá®ááá¯á·á áá±á¬á·ááºááá¬ážáá±á¬ ááá¬ážáá áºáá¯áá±á«áºááœáẠáááºáá®ážáá¬ážáá±á¬ áááºááá·áºá¡ááœáŸááºážáááᯠá¡ááá¯á¡áá»á±á¬áẠáá±á¬á·ááºááá°áá² ááŒá áºááœá¬ážáááºá
ááá¯ááá¯ááŒá±á¬áááẠááá¯ááŒááºáá«áááá·áºáááºááá«áá±ááá·áº áá±áá¬áá±á·á áºáá¬áᬠâááŒá¯ááºáá»áááºâ á¡áááºáááŒá±ááŒá áºáá«áááá·áºáááºá ááá¯á·áá±á¬áº áááºážááẠáááºáá»áŸáááŒá¬ááááŒá áºáááºááááºážá áááºá ETL áá¯ááºáááºážá ááºááẠáá±áá¬áá±á·á áºááᯠááŒááºáááºá¡áááºááœááºážááŒá®ážáá±á¬áẠáááºážááᯠâá¡áááºááŸâ ááŸááºáááºá áœá¬ ááŒá¯ááŒááºáááºážááᯠáááá«ááá¬ážá.
ááá¯ááºáá«á á¡áááºáá±á¬áºááŒáá« ááŒá
áºáááºááẠááá·áºááá
á¹á
ááŸáá·áº áááºáá°áá«á á¡áá¯á¶ážááŒá¯áá«á UNLOGGED
áá«áá±ááá·áº áááºáá±á¬á·á០á
á
áºááŸááºáá±á¬ááá¬ážáá»á¬ážááœáẠá€á¡áááºá¡áá»ááºážááᯠááœáá·áºááá¬ážáá«ááááºááŸá
áºáááºáá±á¬ á¡áá»ááºá¡áááºá
á.áá ON COMMIT { ROWS áá»ááºááẠ| áá»áááº}
á€áááºáá±á¬ááºááŸá¯ááẠááá¬ážáá áºáá¯áááºáá®ážáá±á¬á¡áá« ááœá±áá±ážááœá±áá°áá áºáá¯ááŒá®ážááŒá±á¬ááºáá±á¬á¡áá« á¡ááá¯á¡áá»á±á¬ááºá¡ááŒá¯á¡áá°ááᯠáááºááŸááºááá¯ááºá á±áááºááŒá áºáááºá
á¡áá±á«áº ON COMMIT DROP
á¡áá±á«áºááŸá¬ áá±ážáá¬ážááŒá®ážáá¬áž áá¯ááºáá±ážáá«áááºá DROP TABLE
áá«áá±ááá·áº á¡áá° ON COMMIT DELETE ROWS
á¡ááŒá±á¡áá±á ááá¯á
áááºáááºá
á¬ážááá¯á·áá±á¬ááºážáááºá á¡á²áá«ááᯠáá®ááŸá¬áá¯ááºáá±ážáááºá TRUNCATE TABLE
.
áá¬áá®ááá¬ážáá áºáá¯á meta-áá±á¬áºááŒáá»ááºááᯠááááºážáááºážáááºá¡ááœáẠá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá áºáá¯áá¯á¶ážááẠáá¯á¶ááŸááºááá¬ážáá áºáá¯ááŸáá·áº á¡ááá¡áá»áá°áá®áá±á¬ááŒá±á¬áá·áºá áá¬áá®ááá¬ážáá»á¬ážááᯠá¡áááºáááŒááºáááºáá®ážááŒááºážááŸáá·áº áá»ááºááŒááºážááẠá áá áºááá¬ážáá»á¬ážá ááŒááºážáááºáá±á¬ âáá±á¬ááºáááºážááŒááºážâ ááᯠááŒá áºá á±áááºá pg_classá pg_attributeá pg_attrdefá pg_dependáâŠ
á áá¹ááá·áºááá¯ááºáž ááœá±áá±ážááœá±áá°á¡áá áºáá áºáá¯ááœáá·áºá áááºáá®ážá ááŒáá·áºáá±ážá áá¯ááºáá±á¬ááºáᬠáá¬áá®ááá¬ážááᯠáá»ááºáá±ážááá·áº áá±áá¬áá±á·á áºááá¯á· ááá¯ááºááá¯ááºáá»áááºáááºáá¬ážááá·áº á¡áá¯ááºááá¬ážáá áºáŠážááŸááá±ááŒá®áᯠá áááºáá°ážááŒáá·áºááá¯ááºáá«á áááºážááẠáááºáááºááŸá¯áá áºáá¯á á®á¡ááœáẠá¡ááá¯áááááºáá»á¬ážááᯠááŒá áºá á±áááºá
áá±áá°áá»á¡á¬ážááŒáá·áºá áá«ááᯠááá¯ááºáá«áá²á·á á€ááá
á¹á
ááœááºáááºážáááºááá¯ááá¯áááá±á¬ááºáááºá CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS
ááœá±áá±ážááœá±áá°á
ááºáááºážáá²á áá¯ááºááá¯ááºáá« - ááá¯á·áá±á¬áẠááœá±áá±ážááœá±áá°á¡áá
áºáá
áºáá¯á
á®áá¡á
ááœáẠááá¬ážáá»á¬ážááẠááŸáááŒá®ážáá¬ážááŒá
áºáááºá ááŸááááá·áºáááºá (áá±á«áºááá¯ááŸá¯ááᯠááááºážáááºážáá«á CREATE
)á áá«áá±ááá·áº ááá¬ááŒá
áºáááá·áºáááºááá»á±ážáá°ážá TRUNCATE
ááááºááœá±áá±ážááœá±áá°ááᯠááŒá®ážááŒá±á¬ááºáá±á¬á¡áá« (áááºážááá±á«áºááá¯ááŸá¯ááᯠáá»áœááºá¯ááºááá¯á·áááºáž ááááºážáááºážáá²á·áááº)á
á.áá ááŒáá¯ááºáááº... á¡áá«á¡áááº...
áá¬áá®ááá¬ážáá»á¬ážá¡ááœáẠáá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á áááºáá»á¬ážáá²á០áá áºáá¯ááẠáááºááœááºážááŸá¯ á¡áá»áá¯ážáá»áá¯ážááŒá áºááŒá±á¬ááºáž á¡á ááœáẠáá»áœááºáá±á¬áºááŒá±á¬áá²á·ááẠ- ááŸáá·áº developer ááẠáá áºááŸááºááá¬ážá ááœááºáááºáá»á¬ážá á¬áááºážááᯠááŒá®ážááœá±á·á áœá¬ áá±á¬áºáá®áá°ážááŒá®áž áááºážá áá¬áá®ááŒá±ááŒá¬áá»ááºááœááº...
ááá¯á·áá±á¬áº áá»ááºážááááŒááºážááẠááá¯ážáááºááŸá¯áá¡ááºáá»ááºááŒá áºáááºá á¡á²áá«ááŒá±á¬ááºá· "ááá°áá¬á¡áá±á«áºá¡ááŒá±áá¶á" ááá¬ážá¡áá áºáááºáá®ážáá«á ááá¯ááá¯ážááŸááºážááá¯ááºáá«áááº:
CREATE TEMPORARY TABLE import_table(
LIKE target_table
);
á€ááá¬ážááœáẠáá±áá¬áá»á¬ážá áœá¬ááᯠáááºáá¯ááºáá±ážááá¯ááºáá±á¬ááŒá±á¬áá·áº áááºážááá¯ááŸá¬ááœá±ááŒááºážááẠáááºááá·áºá¡áá«áá»áŸ ááŒááºáááºáááºááá¯ááºáá«á áá«áá±ááá·áº áá®á¡ááœáẠááá¯ážáá¬á¡ááŒá±áá áºáá¯ááŸááá«ááẠ- á¡ááœáŸááºážááááºážáá»á¬ážá áá¯ááºáááºá áá¬áá®ááá¬ážááœááºáááºáž á¡ááœáŸááºážáá»á¬ážáá«ááá¯ááºáááºá.
ááá¯á¡ááºáá±á¬ á¡ááœáŸááºážááááºážáá»á¬ážááẠáá
áºááŸááºááá¬ážá á¡ááœáŸááºážáá»á¬ážááŸáá·áº ááá¯ááºááá¯ááºáá±áá±á¬ááŒá±á¬áá·áº ááá¯ážááŸááºážá
áœá¬ áá±ážááá¯ááºáááºá LIKE target_table INCLUDING INDEXES
.
ááá¯á¡ááºááẠDEFAULT
-values ââ(á¥ááᬠáááºááá±á¬á·áááºááá¯ážáá»á¬áž) ááá¯ááŒáá·áºááẠáááºáá¯á¶ážááá¯ááºáááºá LIKE target_table INCLUDING DEFAULTS
. ááá¯á·ááá¯áẠááá¯ážááŸááºážá
áœá¬- LIKE target_table INCLUDING ALL
- áá¯á¶áá±á á¡ááœáŸááºážáá»á¬ážá ááá·áºáááºáá»ááºáá»á¬ážá...
áá«áá±ááá·áº áááºáá®ážáááºááá¯ááẠáá«ááᯠáá¬ážáááºááá¯á· ááá¯áá«áááºá á¡ááœáŸááºážáá»á¬ážááŒáá·áº ááá¬ážááᯠáá»ááºáá»ááºážáááºááœááºážáá«á ááá¯á·áá±á¬áẠáá±áá¬ááᯠáááºááẠááá¯ááŒá¬áá«áááºáá¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡áááºááŒáá·áºááŒá®ážááŸáᬠá¡ááœáŸááºážááááºážááœá±ááᯠááŸááá·áºááá¯áẠ- á¡á²áá«ááᯠá¥ááá¬áá
áºáá¯á¡áá±áá²á· áááºááá¯ááŒááºáá²á
áá±áá¯áá»áá¯ááŸá
áº,
2. áááºááá¯áá±ážáááá²á
áá¯á¶ážáá«ááá¯á·ááŒá±á¬áá«áá
á±
"pack" á¡á
á¬áž flow INSERT
,
3. áááºááᯠá á®áá¶áá±á¬ááºááœááºááá²á
áá®áá±á¬á· áá»áœááºáá±á¬áºááá¯á·áá²á· intro áá±ážááᯠááŒáá·áºáá¡á±á¬ááºá
- ááá·áºáá±áá¬áá±á·á áºááœáẠááááºážáááºážáá¬ážáá±á¬ áá±á¬ááºáááºáá±áá¬áá«ááá·áº ááá¬ážáá áºáá¯ááŸááááºá 1M ááŸááºáááºážáá»á¬áž
- áá±á·ááá¯ááºáž áá±á¬ááºáááºá áááºážááᯠá¡áá áºáá áºáᯠááá¯á·áááºá "áá¯á¶" á¡ááŒáá·áºá¡á á¯á¶
- á¡ááœá±á·á¡ááŒá¯á¶á¡á áá¶áááºáá¶áá«áááááºá 10K áááºáááá¯áá±á¬ááŸááºáááºážáá»á¬ážááá¯áááŒá±á¬ááºážáá²áá«á
ááá¯áá²á·ááá¯á·áá±á¬ á¡ááŒá±á¡áá±áá»áá¯ážá ááá¹áááẠá¥ááá¬áá
áºáá¯ááŒá
áºáááºá
á.áá á¡ááŒáá·áºá¡á áááºáá°ááŒá¯ááŒááºáž á¡ááºááá¯áá®áááº
ááá¯ážááá¯ážááŸááºážááŸááºážááŒá±á¬áááẠáá±áá¬ááᯠááŒááºáááºááœá²á·á ááºážááá¯á·áá±á¬áẠáááá¯á¡ááºáá°ážááá¯á· ááá¯áá«á áá¯á· - ááá¬ážááᯠááá¯áá»ááºáá²á·áá¯á¶á á¶áá²ááᯠáá°áá¬áá¯á¶áá«áá²á
- ááá¯áááºááŸá¬áž áááŸááá±á¬á·áá±á¬á¡áá¬á¡á¬ážáá¯á¶áž
- áá±á¬ááºáá¯á¶ážááááºáž ááŸáááŸáá·áºááŒá®ážáá¬ážá¡áá¬á¡á¬ážáá¯á¶ážááᯠupdate áá¯ááºáááºááá¯á¡ááºáááºá
- ááá·áºááœááºáž áááŒá áºáá±ážááá»áŸ
á¡áááºááŒá±á¬áá·áº á€á¡á
á®á¡á
á¥áºá¡ááá¯ááºáž áá¯ááºáá±á¬ááºááá·áºááááºážá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº á€áááºážá¡á¬ážááŒáá·áº ááá¬ážá¡ááœááºá¡á
á¬ážááẠá¡áááºážáááºáá»áŸáᬠááŒá®ážááœá¬ážáááºááŒá
áºáá±á¬ááŒá±á¬áá·áº (
dst á០áá»ááºáá«á
ááá¯ááºáá°ážá áááºáááºááŸá¯ ááŸá áºáá¯áá±á¬ááºáá²á· ááŒááºáááºážááá¯ááºáá¬áá±á«á·-
- ááá¯áááºááŸá¬áž (
DELETE
) áá±áá¯áá»á¡á¬ážááŒáá·áº - ááá·áºááœááºáž áá¯á¶á¡áá áºááŸá¡á¬ážáá¯á¶áž
áá áºáá»áááºáááºážááŸá¬ááẠMVCC á áá»á±ážáá°ážááŒá±á¬áá·áºá á á¬ážááœá²áá¡ááœááºá¡á á¬ážááẠááŸá áºáááááááá¯ážáá¬áááºááŒá áºáááºá! 1K á¡ááºááááºááŒá±á¬áá·áº ááá¬ážááŸá ááŸááºáááºážáá»á¬ážá +10M áá¯á¶áá»á¬ážááᯠááá°ááŒááºážááẠá¡ááœááºá¡áá¯á¶ážáá»á¬ážáá«áááº...
dst ááá¯ááŒááºáá¯ááºáá«
áááºááááºáá áºáá¯áá¯á¶ážááᯠá á»á±ážáááºáááºáá¬áá¬áá²á· ááá·áºááŸááºážáá±ážáá¯ááºááá¯ááºáááºááá¯á· ááá¯á¡ááœá±á·á¡ááŒá¯á¶ááŸááá²á· developer á áááá«áááº-
- ááá·áºááŸááºážáá±á¬ (
TRUNCATE
) á á¬ážááœá²áá áºáá¯áá¯á¶áž - ááá·áºááœááºáž áá¯á¶á¡áá áºááŸá¡á¬ážáá¯á¶áž
áááºážáááºážá áááá±á¬ááºáááºá
ááá¯ááá¯áááºááŸá¬-
- áá»áœááºáá±á¬áºááá¯á· á áááºáá±áá«ááŒá®á áá±ááŸááºá¡áá±á¬ááºážá¡áááº
TRUNCATE
áá»ááŸááºáááºá áá®ážááá·áºá¡áá¯á¶ážááŒá¯ááœáá·áº-ááááºááá¯á·ááŒááºážá- áá»áœááºá¯ááºááá¯á·ááẠá€á¡áá»áááºááœáẠá¡ááŒá¬ážáá°áá»á¬ážááŸáá·áº á¡áá»áááºá¡ááŒá¬ááŒá®áž ááá·áºááœááºážááŸá¯ááᯠááŒá¯áá¯ááºáá«áááºá ááááºááá¯ááºáá°ážá
SELECT
áá áºáá¯áá¯áá±á¬á· á¡áááºáááŒá±áá°áž...
á¡ááŒá±á¬ááºážá¡áá²ááá¬ážâŠ á¡áááºááŒá±á¬ááºážâŠ / ááá¬ážáá»áááºâŠ
á¡ááŒá¬ážááœá±ážáá»ááºá áá¬áá áºáá¯ááẠáá®ážááŒá¬ážááá¬ážá¡áá áºáá áºáá¯ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠááŒáá·áºááŒá®áž á¡áá±á¬ááºážááá±áá¬ááœáẠááá¯ážááá¯ážá¡áááºááŒá±á¬ááºážáááºááŒá áºáááºá á áááºáá áºá áᬠá¡áá±ážá¡ááœáŸá¬ážáá±ážáá»á¬áž
- ááŒáááºááœááºážáááºá áá®ážááá·áºá¡áá¯á¶ážááŒá¯ááœáá·áºáááááá¬áᬠáááºáá¬ááœá¬ážáá±ááá·áº
- á€ááá¬ážá¡ááœáẠáá±ážááŒááºážááŸá¯á¡á
á®á¡á
ááº/á
á¬áááºážá¡ááºážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒááºáááºáááºááŸááºáá¬ážááŒá®ážá
ANALYZE áá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá«áááºá - ááá¯ááºáá¶ááŒá¬ážáá±á¬á·á¡á¬ážáá¯á¶áž ááœá²ááœá¬ážáá«ááŒá®á (FK) á á¬ážááœá²
ááŒá¯áá¯ááºáááºá¡ááŒá¶ááŒá¯áá¬ážáá±á¬ Simon Riggs á០WIP patch áá
áºáá¯ááŸááááºá ALTER
- á
á¬áááºážááá¬ážáá»á¬ážááŸáá·áº FK ááá¯ááááá² ááá¯ááºá¡ááá·áºááœáẠááá¬ážááá¯ááºáááºááᯠá¡á
á¬ážááá¯ážááẠáá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á ááá¯á·áá±á¬áº quorum áá
á¯áá±á¬ááºážáá«á
áá»ááºáááºá á¡ááºááááºáá¯ááºáááºá ááá·áºááœááºážáá«á
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáááºážáá¯á¶ážáááºá ááááºááá¯á·ááŒááºážááá¯ááºáá±á¬ ááœá±ážáá»ááºááŸá¯á¡áá±á«áº á¡ááŒá±áá»áááºá áá¯á¶ážáá¯á¶ážáá®ážáá«áž... áá«ááᯠá¡áááá±á¬ááºáá¯á¶áž áááºááá¯áá¯ááºááá²á
-- вÑе ЎелаеЌ в ÑаЌкаÑ
ÑÑаМзакÑОО, ÑÑÐŸÐ±Ñ ÐœÐžÐºÑП Ме вОЎел "пÑПЌежÑÑПÑÐœÑÑ
" ÑПÑÑПÑМОй
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;
á.áá áááºááœááºážááŒá®áž á á®áá¶áá±á¬ááºááœááºááŒááºáž
áá°áá®áá±á¬ KLADR ááœááºá ááŒá±á¬ááºážáá²áá¬ážáá±á¬ ááŸááºáááºážá¡á¬ážáá¯á¶ážááᯠááŒá¯ááŒááºááŒá®ážááá·áºáá±á¬ááºááœáẠáááºáá±á¬ááºážáá¯ááºáá±á¬ááºááá«ááẠ- áá¯á¶ááŸááºááŒá¯áá¯ááºáá¬ážáá±á¬á áá±á¬á·áá»ááºá á¬áá¯á¶ážáá»á¬ážááᯠá¡áá¬ážáá±ážáá±á¬áºááŒááŒá®áž ááá¯á¡ááºáá±á¬ ááœá²á·á ááºážáá¯á¶áá»á¬ážááá¯á· áá»áŸá±á¬á·áá»ááá«áááºá áá«áá±ááá·áº áááºážáááºááá¯áááá²- á¡ááá¡áá» áá¬ááœá± ááŒá±á¬ááºážáá²ááœá¬ážáá²ásynchronization code ááᯠáááŸá¯ááºááœá±ážáá²á áá¯á¶ážáááááá²á
áá áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááá·áºá¡áá»áááºááœáẠááá·áºáá¯ááºáááºážá ááºááœááºáᬠá á¬áá±ážááœáá·áºááŸááá«áá áá»áœááºá¯ááºááá¯á·á¡ááœáẠááŒá±á¬ááºážáá²ááŸá¯á¡á¬ážáá¯á¶ážááᯠá á¯áá±á¬ááºážáá±ážááá·áº á¡á áá»áá¯ážáá áºáá¯ááᯠáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáááº-
-- ÑелевÑе ÑаблОÑÑ
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();
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠááŸááºáááºážááá¬ážáá»á¬ážá០áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ááŒá±á¬ááºážáá²ááŸá¯á¡á¬ážáá¯á¶ážááᯠá¡á±ážá¡á±ážáá±ážáá±ážáá¯ááºáá°ááŒá®áž á¡ááá¯ááá¯ááºááœááºááŒá±ááŸááºážáá°áá»á¬ážááŸáá áºááá·áº áááºážááá¯á·ááá¯áá¯ááºáá±á¬ááºáá«á
á.áá áá»áááºáááºáá¬ážáá±á¬á¡á á¯á¶áá»á¬ážááᯠáááºááœááºážááŒááºážá
á¡áááºážá¡ááŒá áºááŸáá·áº áŠážáááºáá¬á áá±áá¬ááœá²á·á ááºážáá¯á¶áá»á¬ážááẠáá°áá®áá±á¬á¡áá«ááœáẠááŒá áºáááºáá»á¬ážááᯠáá¯á¶ážáááºáá¬ážáá«áááºá ááá¯á·áá±á¬áº ááŒááºáá áá áºáá áºáá¯á០á¡ááºáá¯ááºáááºááŒááºážááẠáá»áœááºá¯ááºááá¯á·ááá±áá¬áá±á·á áºááŸá ááá¯ááŸá±á¬ááºááŸá¯áááºáá±á¬ááºáá¯á¶ááŸáá·áº ááœá²ááŒá¬ážáá±á¬áá¯á¶á á¶áá áºáá¯ááŸááá±áá«á áááºááá¯á·ááŒá áºáááºáááºážá
áá±á¬ááºáááºáá»á¬ážááŸáá·áº áááºážááá¯á·á á¡áá±á¬áá·áºáá»á¬áž ááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž ááá°áá¬á¡ááŒá Ạá á¶ááá°áá¬áá°ááŒáá«á áá¯á·á ááŸá±ážááá¯áž âáá áºáá¯ááŸáá áºáá¯â ááœá±ážáá»ááºááŸá¯á
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)
);
ááá¯á·áá±á¬áº ááŒááºáá¡áááºážá¡ááŒá áºá០áá±á«ááºážáá¯ááºááẠáá»áœááºá¯ááºááá¯á·áᶠâall in oneâ áá¯á¶á á¶ááŒáá·áº áá±á¬ááºáá¬áááº-
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;
á¡áá±á¬áá·áºáá»á¬ážááᯠáá±á¬ááºááẠID áá»á¬ážááŸáá·áº ááŸááºáááºá áœá¬ áá»áááºáááºááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠá€á¡áá±á¬ááºá¡áá¬ážáá»á¬ážááᯠáŠážá áœá¬ááŸá¬ááœá±ááẠááá¯á·ááá¯áẠáá¯ááºáá¯ááºááẠááá¯á¡ááºáá«áááºá áááºážááá¯á·á¡á±á¬ááºááœáẠá¡ááœááºáá»á¬ážááá·áºááŒáá«á áá¯á·á
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
ááŒá±á
á¬ááœáẠááá·áºááœááºážáá±ážáá«áááºá
source: www.habr.com