倧èŠæš¡ãªããŒã¿ã»ããã®è€éãªåŠçïŒããŸããŸãª
ãã®çš®ã®å
žåçãªã¿ã¹ã¯ã¯éåžžã次ã®ããã«ãªããŸãã ãããã ã
ãããããã®ãäœããã®éãæ°çŸã¡ã¬ãã€ãã«éãå§ãããµãŒãã¹ã 24 æé幎äžç¡äŒã§ããŒã¿ããŒã¹ãšé£æºãç¶ããªããã°ãªããªãå Žåãç掻ãå°ç¡ãã«ããå€ãã®å¯äœçšãçºçããŸãã
PostgreSQL (ã ãã§ã¯ãããŸãã) ã§ãããã«å¯ŸåŠããã«ã¯ãããã€ãã®æé©åã䜿çšããŠããã¹ãŠãããé«éã«ãããå°ãªããªãœãŒã¹æ¶è²»ã§åŠçã§ããããã«ããŸãã
1. ã©ãã«çºéããŸãã?
ãŸãããåŠçããããããŒã¿ãã©ãã«ã¢ããããŒãã§ãããã決ããŸãããã
1.1. äžæããŒãã« (TEMPORARY TABLE)
ååãšããŠãPostgreSQL ã®äžæããŒãã«ã¯ä»ã®ãã®ãšåãã§ãã ãããã£ãŠã次ã®ãããªè¿·ä¿¡ã¯ã ãããã«ãããã®ã¯ãã¹ãŠèšæ¶ã®äžã«ã®ã¿ä¿åãããããã¯çµããå¯èœæ§ããããã ããããããã€ãã®éèŠãªéãããããŸãã
ããŒã¿ããŒã¹ãžã®æ¥ç¶ããšã«ç¬èªã®ãåå空éã
XNUMX ã€ã®æ¥ç¶ãåæã«æ¥ç¶ããããšããå Žå 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. ãã°ã«èšé²ãããŠããªãããŒãã«
ããããããšãã°ãXNUMX ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³å ã§å®è£ ã§ããªãããçš®ã®é¢å㪠ETL ããã»ã¹ãããã«ããããããããŸã ãã©ã³ã¶ã¯ã·ã§ã³ã¢ãŒãã®pgbouncerïŒ..
ãŸãã¯ãããŒã¿ ãããŒã倧ããããããã XNUMX ã€ã®æ¥ç¶ã§ååãªåž¯åå¹ ããããŸãã ããŒã¿ããŒã¹ãã (èªã¿åããCPU ããšã« XNUMX ã€ã®ããã»ã¹)?
ãŸãã¯ãäœããã®æäœãé²è¡äžã§ã éåæçã« å¥ã®æ¥ç¶ã§?.
ããã§ã®éžæè¢ã¯ XNUMX ã€ã ãã§ã - äžæçã«éäžæããŒãã«ãäœæããã ããããããã ãã ããã¯ïŒ
- 誰ãšã亀差ããªãããã«ãæ倧ââéã©ã³ãã ãªååãä»ããŠãç¬èªã®ãããŒãã«ãäœæããŸãã
- ãšãã¹: å€éšãœãŒã¹ããã®ããŒã¿ãåã蟌ã¿ãŸãã
- æé©åã®é©çš: å€æãããããŒãªã³ã¯ãã£ãŒã«ãã«å ¥åãããŸãã
- è² è·: æºåãã§ããããŒã¿ãã¿ãŒã²ããããŒãã«ã«æ³šã蟌ã¿ãŸãã
- ãç§ã®ãããŒãã«ãåé€ããŸãã
ãããŠä» - è»èã®äžã®ããšã å®éã«ã¯ã PostgreSQL ã§ã®æžã蟌ã¿ã¯ãã¹ãŠ XNUMX åè¡ãããŸã - COMMIT
ãããããš ROLLBACK
'ãã«ãã©ã³ã¶ã¯ã·ã§ã³ã
ã§ãããããªãã®ã¯å¿ èŠãããŸããïŒ ããã»ã¹å šäœã¯ç§ãã¡ã«ãããŸã ããã¯å®å šã«æåããããããã§ãªãã£ããã®ã©ã¡ããã§ããã äžéãã©ã³ã¶ã¯ã·ã§ã³ãããã€ãããã¯åé¡ã§ã¯ãããŸãããç¹ã«ãã©ãã§è¡ãããããæ確ã§ãªãå Žåããéäžããããã»ã¹ãç¶è¡ãããããšã«ã¯èå³ããããŸããã
ãããè¡ãããã«ãPostgreSQL éçºè
ã¯ããŒãžã§ã³ 9.1 ã§æ¬¡ã®ãããªãã®ãå°å
¥ããŸããã
ãã®æ瀺ã«ãããããŒãã«ã¯ãã°ãèšé²ãããªããã®ãšããŠäœæãããŸãã ãã°ãèšé²ãããŠããªãããŒãã«ã«æžã蟌ãŸããããŒã¿ã¯ãå è¡æžã蟌ã¿ãã° (第 29 ç« ãåç §) ãééããªãããããã®ãããªããŒãã«ã¯ ãã€ããããã£ãšæ©ãä»äºãããã ãã ãã倱æãå ããªãããã§ã¯ãããŸããã ãµãŒããŒé害ãŸãã¯ç·æ¥ã·ã£ããããŠã³ã®å Žåããã°ã«èšé²ãããŠããªãããŒãã« èªåçã«åãæšãŠãããã ããã«ããã°ã«èšé²ãããŠããªãããŒãã«ã®å 容 è€è£œãããŠããªã ã¹ã¬ãŒããµãŒããŒã«ã ãã°ãèšé²ãããªãããŒãã«ã«äœæãããã€ã³ããã¯ã¹ã¯ãèªåçã«ãã°ãèšé²ãããªããªããŸãã
èŠããã«ã ã¯ããã«éããªããŸã, ããããããŒã¿ããŒã¹ãµãŒããŒããèœã¡ããå Žåã¯äžå¿«ã§ãã ããããããã¯ã©ã®ãããã®é »åºŠã§èµ·ããã®ã§ãããã?ãŸããETL ããã»ã¹ã¯ãããŒã¿ããŒã¹ããå掻æ§åãããåŸãããããéäžãããæ£ããä¿®æ£ããæ¹æ³ãç¥ã£ãŠããŸãã?
ããã§ãªãå Žåãããã³äžèšã®ã±ãŒã¹ãããªãã®å ŽåãšäŒŒãŠããå Žåã¯ã次ã䜿çšããŸãã UNLOGGED
ããã決ã㊠å®éã®ããŒãã«ã§ã¯ãã®å±æ§ãæå¹ã«ããªãã§ãã ãããããªãã«ãšã£ãŠå€§åãªããŒã¿ã
1.3. ON 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. ããšãã°...ãå«ã...
åé ã§ãäžæããŒãã«ã®å žåçãªäœ¿çšäŸã® XNUMX ã€ã¯ãããŸããŸãªçš®é¡ã®ã€ã³ããŒãã§ãããšè¿°ã¹ãŸãããéçºè ã¯ãã¿ãŒã²ãã ããŒãã«ã®ãã£ãŒã«ãã®ãªã¹ãããäžæããŒãã«ã®å®£èšã«ã³ããŒã¢ã³ãããŒã¹ãããã®ã«èŠåŽããŸãã
ããããæ æ°ã¯é²æ©ã®åååã§ãã ãããçç±ã§ã ããµã³ãã«ã«åºã¥ããŠãæ°ããããŒãã«ãäœæããŸã ãã£ãšç°¡åã«ããããšãã§ããŸã:
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.ã©ããã£ãŠæžãã®ïŒ
ãã èšã£ãŠãããŸã - 䜿ã£ãŠãã ãã
-ãããã¯ãã®ä»£ããã«ãã㌠INSERT
,
3. ã©ã®ããã«åŠçããã®ã§ãã?
ããã§ã¯ãã€ã³ããã次ã®ããã«ããŠã¿ãŸãããã
- ããŒã¿ããŒã¹ã«ã¯ã©ã€ã¢ã³ãããŒã¿ãæ ŒçŽããããŒãã«ãããå Žå 1äžä»¶ã®ã¬ã³ãŒã
- æ¯æ¥ãã¯ã©ã€ã¢ã³ãããæ°ãããã®ãéãããŠããŸã å®å šãªãã€ã¡ãŒãžã
- çµéšãããããªãã¯æã ãããç¥ã£ãŠããŸã å€æŽãããã¬ã³ãŒã㯠10 件ãŸã§ã§ã
ãã®ãããªç¶æ³ã®å
žåçãªäŸã¯æ¬¡ã®ãšããã§ãã
3.1. å®å šåæã¢ã«ãŽãªãºã
話ãç°¡åã«ããããã«ãããŒã¿ãåæ§ç¯ããå¿ èŠãããªããšããŸããããŒãã«ãç®çã®åœ¢åŒã«ããã ãã§ããã€ãŸãã次ã®ããã«ãªããŸãã
- é€å»ãã ããååšããªããã¹ãŠã®ãã®
- ãªãã¬ãã·ã¥ãã ãã§ã«ååšããæŽæ°ããå¿ èŠããããã®ãã¹ãŠ
- вÑÑавОÑÑ ãŸã èµ·ãã£ãŠããªãããšãã¹ãŠ
ãªããã®é åºã§æäœãå®è¡ããå¿
èŠãããã®ã§ãããã? ããã«ãããããŒãã« ãµã€ãºã®å¢å ãæå°éã«æãããããã (
dst ããåé€
ãããããã¡ããã次㮠XNUMX ã€ã®æäœã ãã§æžã¿ãŸãã
- é€å»ãã (
DELETE
ïŒäžè¬çã«ãã¹ãŠ - вÑÑавОÑÑ ãã¹ãŠã¯æ°ããã€ã¡ãŒãžãã
ãããåæã«ãMVCC ã®ãããã§ã ããŒãã«ã®ãµã€ãºã¯ã¡ããã© XNUMX åã«ãªããŸãïŒ 1K ã®æŽæ°ã«ããããŒãã«å ã®ã¬ã³ãŒãã® +10 äžã€ã¡ãŒãžãååŸããã®ã¯ããŸããŸãã®åé·æ§ã§ã...
dst ã®åãæšãŠ
çµéšè±å¯ãªéçºè ã¯ãã¿ãã¬ããå šäœãéåžžã«å®äŸ¡ã«ã¯ãªãŒãã³ã°ã§ããããšãç¥ã£ãŠããŸãã
- ã¯ãªã¢ (
TRUNCATE
) ããŒãã«å šäœ - вÑÑавОÑÑ ãã¹ãŠã¯æ°ããã€ã¡ãŒãžãã
ãšããæ¹æ³ãå¹æçã§ã
ã€ãŸã:
- å§ããŸã é·æéå®è¡ããããã©ã³ã¶ã¯ã·ã§ã³
TRUNCATE
課ã ã¢ã¯ã»ã¹å°çš-ããããã³ã°- ç§ãã¡ã¯é·ãéæ¿å
¥ãè¡ããŸãããä»ã®äººã¯ãã®æç¹ã§ ããããã§ããªã
SELECT
äœããããŸããããŸãã...
ALTER TABLE⊠RENAME⊠/ DROP TABLEâŠ
å¥ã®æ¹æ³ãšããŠã¯ããã¹ãŠãå¥ã®æ°ããããŒãã«ã«å ¥åããå€ãããŒãã«ã®ååãå€æŽããã ãã§ãã åä»ãªäºçŽ°ãªããšãããã€ããããŸã:
- ãŸã ããã ã¢ã¯ã»ã¹å°çšæéã¯å€§å¹ ã«ççž®ãããŸããã
- ãã®ããŒãã«ã®ãã¹ãŠã®ã¯ãšãª ãã©ã³/çµ±èšããªã»ãããããŸãã
ANALYZEãå®è¡ããå¿ èŠããããŸã - ãã¹ãŠã®å€éšããŒãå£ããŠããŸã (FK) ããŒãã«ãž
Simon Riggs ããã® WIP ããããããã ALTER
-çµ±èšãFKã«ã¯è§Šããã«ãã¡ã€ã«ã¬ãã«ã§ããŒãã«æ¬äœã眮ãæããæäœã§ãããã¯ã©ãŒã©ã ã¯åéãããŸããã§ããã
åé€ãæŽæ°ãæ¿å ¥
ãããã£ãŠãXNUMX ã€ã®æäœã®ãã³ããããã³ã° ãªãã·ã§ã³ã«èœã¡çããŸãã ãããã XNUMX ã€ã§ã...ãããæãå¹æçã«è¡ãã«ã¯ã©ãããã°ããã§ãããã?
-- вÑе ЎелаеЌ в ÑаЌкаÑ
ÑÑаМзакÑОО, ÑÑÐŸÐ±Ñ ÐœÐžÐºÑП Ме вОЎел "пÑПЌежÑÑПÑÐœÑÑ
" ÑПÑÑПÑМОй
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. ãªã³ã¯ãããã»ããã®ã€ã³ããŒã
äžèšã§ã¯ãéä¿¡å ãšå®å ã®ããŒã¿æ§é ãåãå Žåãæ€èšããŸããã ããããå€éšã·ã¹ãã ããã®ã¢ããããŒãã®åœ¢åŒãããŒã¿ããŒã¹ã®ã¹ãã¬ãŒãžæ§é ãšç°ãªãå Žåã¯ã©ããªãã§ãããã?
äŸãšããŠãã¯ã©ã€ã¢ã³ããšãã®ã¢ã«ãŠã³ãã®ã¹ãã¬ãŒãžãå€å žçãªãå€å¯Ÿ XNUMXããªãã·ã§ã³ãèããŠã¿ãŸãããã
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;
ã¢ã«ãŠã³ãã顧客 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
ãããã«è«æ±æžãæ¿å
¥ããŸãã
åºæïŒ habr.com