ΠΡΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ
Π½Π°Π±ΠΎΡΠΎΠ² Π΄Π°Π½Π½ΡΡ
(ΡΠ°Π·Π½ΡΠ΅
Π’ΠΈΠΏΠΎΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π·Π²ΡΡΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ: Β«ΠΠΎΡ ΡΡΡ
ΠΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ Β«ΡΠ΅Π³ΠΎ-ΡΠΎΒ» Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅ΡΡΡΡΡΡ ΡΠΎΡΠ½ΡΠΌΠΈ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ, Π° ΡΠ΅ΡΠ²ΠΈΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±Π°Π·ΠΎΠΉ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ 24×7, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ side-ΡΡΡΠ΅ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΡΠΈΡΡ Π²Π°ΠΌ ΠΆΠΈΠ·Π½Ρ.
Π§ΡΠΎΠ±Ρ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ Ρ Π½ΠΈΠΌΠΈ Π² PostgreSQL (Π΄Π° ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Π½Π΅ΠΌ), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΡΠ΅ Π±ΡΡΡΡΠ΅Π΅ ΠΈ Ρ ΠΌΠ΅Π½ΡΡΠΈΠΌ ΡΠ°ΡΡ
ΠΎΠ΄ΠΎΠΌ ΡΠ΅ΡΡΡΡΠΎΠ².
1. ΠΡΠ΄Π° Π³ΡΡΠ·ΠΈΡΡ?
Π‘Π½Π°ΡΠ°Π»Π° Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌΡΡ, ΠΊΡΠ΄Π° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π»ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Β«ΠΎΡΠΏΡΠΎΡΠ΅ΡΡΠΈΡΡΒ».
1.1. ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ (TEMPORARY TABLE)
Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π΄Π»Ρ PostgreSQL Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ β ΡΡΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅. ΠΠΎΡΡΠΎΠΌΡ Π½Π΅Π²Π΅ΡΠ½Ρ ΡΡΠ΅Π²Π΅ΡΠΈΡ ΡΠΈΠΏΠ° Β«ΡΠ°ΠΌ Π²ΡΠ΅ Ρ ΡΠ°Π½ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π° ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΡΡΡΡΒ». ΠΠΎ Π΅ΡΡΡ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ»ΠΈΡΠΈΠΉ.
Π‘Π²ΠΎΠΉ Β«Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΒ» Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΠ
ΠΡΠ»ΠΈ Π΄Π²Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ CREATE TABLE x
, ΡΠΎ ΠΊΡΠΎ-ΡΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ Π½Π΅ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΠ.
Π Π²ΠΎΡ Π΅ΡΠ»ΠΈ ΠΎΠ±Π° ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ CREATE TEMPORARY TABLE x
, ΡΠΎ ΠΎΠ±Π° Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠ²ΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ°Π±Π»ΠΈΡΡ. Π Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
Β«Π‘Π°ΠΌΠΎΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΠ΅Β» ΠΏΡΠΈ disconnect
ΠΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Β«Π²ΡΡΡΠ½ΡΡΒ» Π²ΡΠΏΠΎΠ»Π½ΡΡΡ DROP TABLE x
ΡΠΌΡΡΠ»Π° Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ, ΠΊΡΠΎΠΌΠ΅β¦
ΠΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π· pgbouncer Π² transaction mode, ΡΠΎ Π±Π°Π·Π°-ΡΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅ Π΅ΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ, ΠΈ Π² Π½Π΅ΠΌ-ΡΠΎ ΡΡΠ° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
ΠΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠΎΠ·Π΄Π°ΡΡ Π΅Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΡΠΆΠ΅ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ pgbouncer, ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ΅. ΠΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΡΡ CREATE TEMPORARY TABLE IF NOT EXISTS x
.
ΠΡΠ°Π²Π΄Π°, Π»ΡΡΡΠ΅ ΡΠ°ΠΊ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ Π½Π΅ Π΄Π΅Π»Π°ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π·Π°ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Β«Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎΒ» ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΡΠ°ΠΌ, ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΠΎΡ Β«ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡΡΠ°Β» Π΄Π°Π½Π½ΡΠ΅. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π»ΡΡΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ-ΡΠ°ΠΊΠΈ ΠΌΠ°Π½ΡΠ°Π», ΠΈ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠΏΠΈΡΠ°ΡΡ ON COMMIT DROP
β ΡΠΎ Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΠ° Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»Π΅Π½Π°.
ΠΠ΅-ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ
Π ΡΠΈΠ»Ρ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Π½Π΅ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΡΡΡΡΡ. ΠΠ°ΡΠΎ ΡΡΠΎ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅Ρ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ Π² heap + WAL, ΠΏΠΎΡΡΠΎΠΌΡ INSERT/UPDATE/DELETE Π² Π½Π΅Π΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π±ΡΡΡΡΠ΅Π΅.
ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ β ΡΡΠΎ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ Β«ΠΏΠΎΡΡΠΈ ΠΎΠ±ΡΡΠ½Π°ΡΒ» ΡΠ°Π±Π»ΠΈΡΠ°, ΡΠΎ ΠΈ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ΅ Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅Π»ΡΠ·Ρ ΡΠΎΠΆΠ΅. ΠΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΏΠΎΠΊΠ°, Ρ ΠΎΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΠ°ΡΡ ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Ρ ΠΎΠ΄ΠΈΡ.
1.2. ΠΠ΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ (UNLOGGED TABLE)
ΠΠΎ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΉ ETL-ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΡΠ΄Π°Π΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π° Ρ Π²Π°Ρ ΡΠ°ΠΊΠΈ pgbouncer Π² transaction mode?..
ΠΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π²Π΅Π»ΠΈΠΊ, ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΠΠ (ΡΠΈΡΠ°ΠΉ, ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π° CPU)?..
ΠΠ»ΠΈ ΡΠ°ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΈΠ΄ΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ Π² ΡΠ°Π·Π½ΡΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠ°Ρ ?..
Π’ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ β Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π΅-Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ°Π»Π°ΠΌΠ±ΡΡ, Π°Π³Π°. Π’ΠΎ Π΅ΡΡΡ:
- ΡΠΎΠ·Π΄Π°Π» Β«ΡΠ²ΠΎΠΈΒ» ΡΠ°Π±Π»ΠΈΡΡ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ-ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΡΡΠΎΠ±Ρ Π½ΠΈ Ρ ΠΊΠ΅ΠΌ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΡΡΡ
- Extract: Π·Π°Π»ΠΈΠ» Π² Π½ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°
- Transform: ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π», Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ» ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡΠΈΠ΅ ΠΏΠΎΠ»Ρ
- Load: ΠΏΠ΅ΡΠ΅Π»ΠΈΠ» Π³ΠΎΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ΅Π»Π΅Π²ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ
- ΡΠ΄Π°Π»ΠΈΠ» Β«ΡΠ²ΠΎΠΈΒ» ΡΠ°Π±Π»ΠΈΡΡ
Π ΡΠ΅ΠΏΠ΅ΡΡ β Π»ΠΎΠΆΠΊΠ° Π΄Π΅Π³ΡΡ. ΠΠΎ ΡΡΡΠΈ, Π²ΡΡ Π·Π°ΠΏΠΈΡΡ Π² PostgreSQL ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π΄Π²Π°ΠΆΠ΄Ρ β COMMIT
‘Π½ΡΡΡΠΌΠΈ ΠΈ ROLLBACK
‘Π½ΡΡΡΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ.
ΠΠΎ Π½Π°ΠΌ-ΡΠΎ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ! Π£ Π½Π°Ρ Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ»ΠΈ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΡΠ΅Π», ΠΈΠ»ΠΈ Π½Π΅Ρ. ΠΠ΅Π²Π°ΠΆΠ½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π² Π½Π΅ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ β Π½Π°ΠΌ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Β«ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Ρ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½ΡΒ», ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π³Π΄Π΅ ΠΎΠ½Π° Π±ΡΠ»Π°.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ PostgreSQL Π΅ΡΠ΅ Π² Π²Π΅ΡΡΠΈΠΈ 9.1 Π²Π½Π΅Π΄ΡΠΈΠ»ΠΈ ΡΠ°ΠΊΡΡ ΡΡΡΠΊΡ ΠΊΠ°ΠΊ
Π‘ ΡΡΠΈΠΌ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π±Π»ΠΈΡΠ° ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π½Π΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΠ°Ρ. ΠΠ°Π½Π½ΡΠ΅, Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠ΅ Π² Π½Π΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ, Π½Π΅ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· ΠΆΡΡΠ½Π°Π» ΠΏΡΠ΅Π΄Π·Π°ΠΏΠΈΡΠΈ (ΡΠΌ. ΠΠ»Π°Π²Ρ 29), Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΡΠ°ΠΊΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΡΡΡΡΠ΅Π΅ ΠΎΠ±ΡΡΠ½ΡΡ . ΠΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ½ΠΈ Π½Π΅ Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΎΡ ΡΠ±ΠΎΡ; ΠΏΡΠΈ ΡΠ±ΠΎΠ΅ ΠΈΠ»ΠΈ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠΌ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ΅ΠΊΠ°Π΅ΡΡΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π½Π΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π½Π΅ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΡΠ΅ΡΡΡ Π½Π° Π²Π΅Π΄ΠΎΠΌΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΡΠ±ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π΄Π»Ρ Π½Π΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π½Π΅ΠΆΡΡΠ½Π°Π»ΠΈΡΡΠ΅ΠΌΡΠΌΠΈ.
ΠΠΎΡΠΎΡΠ΅, Π±ΡΠ΄Π΅Ρ ΡΠΈΠ»ΡΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅, Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΠ Β«ΡΠΏΠ°Π΄Π΅ΡΒ» β Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ. ΠΠΎ ΡΠ°ΡΡΠΎ Π»ΠΈ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΈ ΡΠΌΠ΅Π΅Ρ Π»ΠΈ Π²Π°Ρ ETL-ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π΄ΠΎΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Β«Ρ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½ΡΒ» ΠΏΠΎΡΠ»Π΅ Β«ΠΎΠΆΠΈΠ²Π»Π΅Π½ΠΈΡΒ» ΠΠ?..
ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΈ Π½Π΅Ρ, ΠΈ ΠΊΠ΅ΠΉΡ Π²ΡΡΠ΅ ΠΏΠΎΡ
ΠΎΠΆ Π½Π° Π²Π°Ρ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ UNLOGGED
, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ ΡΡΠΎΡ Π°ΡΡΠΈΠ±ΡΡ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΡΠ°Π±Π»ΠΈΡΠ°Ρ
, Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π²Π°ΠΌ Π΄ΠΎΡΠΎΠ³ΠΈ.
1.3. ON COMMIT { DELETE ROWS | 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. LIKEβ¦ INCLUDING …
Π― ΡΠΏΠΎΠΌΡΠ½ΡΠ» Π² Π½Π°ΡΠ°Π»Π΅, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΈΠΏΠΈΡΠ½ΡΡ use case Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡ β ΡΡΠΎ ΡΠ°Π·Π½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΠΈΠΌΠΏΠΎΡΡΡ β ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΡΠ°Π»ΠΎ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΠΈΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΅ΠΉ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉβ¦
ΠΠΎ Π»Π΅Π½Ρ β Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ°! ΠΠΎΡΡΠΎΠΌΡ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Β«ΠΏΠΎ ΠΎΠ±ΡΠ°Π·ΡΡΒ» ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅:
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. ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ?
ΠΡΠ°ΠΊ, ΠΏΡΡΡΡ Π½Π°ΡΠ° Π²Π²ΠΎΠ΄Π½Π°Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
- Ρ Π²Π°Ρ Π² Π±Π°Π·Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ ΡΠ°Π±Π»ΠΈΡΠΊΠ° Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π° 1M Π·Π°ΠΏΠΈΡΠ΅ΠΉ
- ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΈΡΡΠ»Π°Π΅Ρ Π²Π°ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΠ»Π½ΡΠΉ Β«ΠΎΠ±ΡΠ°Π·Β»
- ΠΏΠΎ ΠΎΠΏΡΡΡ Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΠΎΡ ΡΠ°Π·Π° ΠΊ ΡΠ°Π·Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 10K Π·Π°ΠΏΠΈΡΠ΅ΠΉ
ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ
3.1. ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ
ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΡΡΠΎ Π²Π°ΠΌ Π΄Π°ΠΆΠ΅ ΡΠ΅ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ β ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠ°Π±Π»ΠΈΡΡ Π² Π½ΡΠΆΠ½ΡΠΉ Π²ΠΈΠ΄, ΡΠΎ Π΅ΡΡΡ:
- ΡΠ΄Π°Π»ΠΈΡΡ Π²ΡΠ΅, ΡΠ΅Π³ΠΎ ΡΠΆΠ΅ Π½Π΅Ρ
- ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠ΅, ΡΡΠΎ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ, ΠΈ Π½Π°Π΄ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ
- Π²ΡΡΠ°Π²ΠΈΡΡ Π²ΡΠ΅, ΡΠ΅Π³ΠΎ Π΅ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ
ΠΠΎΡΠ΅ΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΡΠΎΠΈΡ Π΄Π΅Π»Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ Π²ΡΡΠ°ΡΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ (
DELETE FROM dst
ΠΠ΅Ρ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²ΡΠΌΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ:
- ΡΠ΄Π°Π»ΠΈΡΡ (
DELETE
) Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΡΠ΅ - Π²ΡΡΠ°Π²ΠΈΡΡ Π²ΡΠ΅ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π°
ΠΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ MVCC, ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡΡ ΡΠΎΠ²Π½ΠΎ Π² Π΄Π²Π° ΡΠ°Π·Π°! ΠΠΎΠ»ΡΡΠΈΡΡ +1M ΠΎΠ±ΡΠ°Π·ΠΎΠ² Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠ·-Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ 10K β ΡΠ°ΠΊ ΡΠ΅Π±Π΅ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΡΡΡβ¦
TRUNCATE dst
ΠΠΎΠ»Π΅Π΅ ΠΎΠΏΡΡΠ½ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π·Π½Π°Π΅Ρ, ΡΡΠΎ Π²ΡΡ ΡΠ°Π±Π»ΠΈΡΠΊΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ Π·Π°ΡΠΈΡΡΠΈΡΡ:
- ΠΎΡΠΈΡΡΠΈΡΡ (
TRUNCATE
) ΡΠ°Π±Π»ΠΈΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ - Π²ΡΡΠ°Π²ΠΈΡΡ Π²ΡΠ΅ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π°
ΠΠ΅ΡΠΎΠ΄ Π΄Π΅ΠΉΡΡΠ²Π΅Π½Π½ΡΠΉ,
Π Π·Π½Π°ΡΠΈΡ:
- Ρ Π½Π°Ρ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ
TRUNCATE
Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ AccessExclusive-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ- ΠΌΡ Π΄ΠΎΠ»Π³ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΡΠ°Π²ΠΊΡ, Π° Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ Π΄Π°ΠΆΠ΅
SELECT
Π§Π΅-ΡΠΎ Π½Π΅Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡβ¦
ALTER TABLEβ¦ RENAMEβ¦ / DROP TABLE …
ΠΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ β Π·Π°Π»ΠΈΡΡ Π²ΡΠ΅ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ Π½Π° ΠΌΠ΅ΡΡΠΎ ΡΡΠ°ΡΠΎΠΉ. ΠΠ°ΡΠ° ΠΏΡΠΎΡΠΈΠ²Π½ΡΡ ΠΌΠ΅Π»ΠΎΡΠ΅ΠΉ:
- ΡΠ°ΠΊΠΈ ΡΠΎΠΆΠ΅ AccessExclusive, Ρ ΠΎΡΡ ΠΈ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
- ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ Π²ΡΠ΅ ΠΏΠ»Π°Π½Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ²/ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ,
Π½Π°Π΄ΠΎ Π³ΠΎΠ½ΡΡΡ ANALYZE - Π»ΠΎΠΌΠ°ΡΡΡΡ Π²ΡΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΊΠ»ΡΡΠΈ (FK) Π½Π° ΡΠ°Π±Π»ΠΈΡΡ
ΠΡΠ» WIP-ΠΏΠ°ΡΡ ΠΎΡ Simon Riggs, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π» ΡΠ΄Π΅Π»Π°ΡΡ ALTER
-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ ΡΠ΅Π»Π° ΡΠ°Π±Π»ΠΈΡΡ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, Π½Π΅ ΡΡΠΎΠ³Π°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΈ FK, Π½ΠΎ Π½Π΅ ΡΠΎΠ±ΡΠ°Π» ΠΊΠ²ΠΎΡΡΠΌΠ°.
DELETE, UPDATE, INSERT
ΠΡΠ°ΠΊ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΡ Π½Π° Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΈΠ· ΡΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΠΎΡΡΠΈ ΡΡΠ΅Ρ β¦ ΠΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ?
-- Π²ΡΠ΅ Π΄Π΅Π»Π°Π΅ΠΌ Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π²ΠΈΠ΄Π΅Π» "ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ
" ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ
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. ΠΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠΌΠΏΠΎΡΡΠ°
Π ΡΠΎΠΌ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΌ ΠΠΠΠΠ Π΅ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠ΅ΡΡ Π·Π°ΠΏΠΈΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ³Π½Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ β Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ, Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°, ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π½ΡΠΆΠ½ΡΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ. ΠΠΎ ΠΊΠ°ΠΊ ΡΠ·Π½Π°ΡΡ β ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ»ΠΎΡΡ, Π½Π΅ ΡΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΊΠΎΠ΄ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, Π² ΠΈΠ΄Π΅Π°Π»Π΅, Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΡΡΠΎΠ³Π°Ρ Π΅Π³ΠΎ?
ΠΡΠ»ΠΈ Π΄ΠΎΡΡΡΠΏ Π½Π° Π·Π°ΠΏΠΈΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΈΠ³Π³Π΅ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ±Π΅ΡΠ΅Ρ Π΄Π»Ρ Π½Π°Ρ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
-- ΡΠ΅Π»Π΅Π²ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ
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();
Π ΠΏΠΎΡΠΎΠΌ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΈΠ· 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;
Π§ΡΠΎΠ±Ρ ΡΡΠ΅ΡΠ° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°ΡΡ Ρ ID ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², Π½Π°ΠΌ ΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Π½Π°Π΄ΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ·Π½Π°ΡΡ ΠΈΠ»ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ΄ Π½ΠΈΡ ΠΏΠΎΠ»Ρ:
ALTER TABLE invoice_import ADD COLUMN client_id integer;
ALTER TABLE client_import ADD COLUMN client_id integer;
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΈΡ Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠΎΠΏΡΠ°Π²ΠΊΠΎΠΉ β Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ Π² ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅, Π²Π΅Π΄Ρ ΠΈΠΌΠΏΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Ρ Π½Π°Ρ Β«append-onlyΒ»:
-- ΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠ° 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