ááµáá
ášááᥠáµá¥áµáŠáœ ááµá¥áµá¥ áá°áµ (ášá°áá«á©
ášáá
áááá± ášá°ááá° á°áá£á á¥ááá áá á¥áá°áá
á«á ááá áááµáá- "á¥áá
á
ááá áá ášáá
"ááá" áá á á áá¶áᜠá ááá á© ááá£ááµ ááµá¥ ááá«áµ á²ááá á¥á á ááááá± ášáášá áá± 24x7 áá ááµá«á±á ááá á á áá áµ, á¥á ášááá®áœ áá³á¶áœ á
ááá¶á á«á áá»á.
á 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
- áááµá áá¥áá± á²á ááá
á áá ášá¡ á á«áµ-á°á áá°ášááá¢
ášááá£á
á¥áá± ášá ááµ ášá°áá°á áááááµ á¥á» áµáááᣠááá«á á áá ášáŠáœ á áá°áááᢠáá áá ášááᥠáµáᥠáá ášáœ á áµáááááµá á«áµááá³á á heap + WALᣠáµááá á áµáá£/á ááá/á°áá á á£á áá£á ááá¢
ááá áá ááá«á á áá ášá¥ á ááá "ášáá áá°á á°á«" á ášáŽá áµááá, á á°á£á ááá ááá á á ááœáá. á¢á«ááµ áá áá ᣠááá á¥áá³á á°áá³á áá£á áá«á áášá á áá á¥ášá°á°á«áš á¢áááá¢
1.2. á«áá°áááá á ášáŽá
áá áá ááµášá á¥áá³ááŠáµ ááá³á á á ááµ áá¥ááµ ááµá¥ áá°áá á ášáááœá ášá£áµ ášá¢á²á€á áá°áµ á«áá áá á ááá á áá ᢠpgbouncer á áá¥ááµ ááá³? ..
ááá ášáášá áá°á± á á£á áµáá áá á á ááµ áááááµ áá á á ášáá°áááá« áááµ ášááᢠášáášá ááµ (á áá¥á¥á£ á ááµ áá°áµ á á ááµ á²áá©)?...
ááá á áá³ááµ áµá«áᜠá¥ášá°ášááá ááᢠá áá°áá³á°ááᢠá á°áá«á© ááááá¶áœ? ..
á¥áá á ááµ á áá«á á¥á» á á - áááá ááá«á á«ááá á ášáŽá ááá á©. ááᣠá áᢠá«áá:
- ášááá áá áááááááµ "ášá«áŽ" á ášáŽáááœá á ášáá°á ášáááá° áµáᜠáá áš
- ááá£áµášáá ááá á á°áá áášá ááá£ážá
- ááá¥: á°ááá ᣠá ááá áá«á«á£ ááµá®áœ á°ááá·áá¢
- ážááááá ááᥠáá° á¢áá á°áá ášáŠáœ áá°á°
- "ášá¥á" á°áá ášáŠáœ á°á°áááá
á¥á á áá - á á
á£áµ ááµá¥ ááá¥. á á¥ááá±, ááá á PostgreSQL ááµá¥ ááœáá áááµ áá áášá°á³á - COMMIT
'nutty á¥á ROLLBACK
á£á¶ áá¥áá¶áœá¢
áá áá á á«áµááááá! á á ááá áá°á±á á ááᢠáá á áá ášá°á³á« áá á ááá á ááá ášáá¢. áá á«á á áá«ášáá áá¥áá¶áœ á¥áá°ááá© ááá áœáá ášááá - á á°ááá ášáµ á¥áá°áá áš ááᜠá ááááá áµ áá "áá°á±á ášááá áááá á" ááááµ ášááá.
áá
áá áááµášáᣠᚠââPostgreSQL ááá¢ááœá£ áá° áµáªáµ 9.1 á°ááá°á á¥áá°áá
á«á ááá á áµá°ááááá
á áá á ááá«áœ, á°áá ášá¡ á¥áá° á°ááá á°áá áš. áá° áááá¡ á áá ášáŠáœ ášá°áá áášá áá°ááµ áááá (ááá«á 29 á áááášá±) áá á á áá ášáŠáœá á«áµášáµáá. ášááµá®á á á áá áá¥ááµ ááµá«áµ. ááá á¥áá ášááµááµ áá á áá°áá; ášá áááá ááµááµ ááá ášá á°á áá ááááµ ášááᣠá«áá°áááá á ášáŽá á á«áµ-á°á á°ááá§á. á á°ášááªá ᣠá«áá°áááá á á°áá ášá¥ ááá¶áœ á áá°á°áááᢠáá° á£áªá« á áááá®áœ. á£áá°áááá á áá ášá¥ áá ášá°áá á© áááážáá á¢ááŽáá¶áœ á á«áµ á°á áášáá³áá¢
á á áá©á£ á á£á áá£á áááá, ááá áá ášááᥠáá³ á áááá© "ášáá°á" ášáá, á°áµ ášááá áááá. áá áá ááá á«á á áá áášá°á³á á¥á áš ETL áá°áµá ášááᥠáá³áá "ášá³á°á°" á áá á¥ááŽáµ á áµááá "ášááá" ááµá°á«ášá á¥áá³áá áµ á«ááá?
á«ááá á¥á ášáá á«áá áá³á ášá¥ááµá áá á°áá³á³á áá, áá áá UNLOGGED
áá á áá«áœ áá
áá á£á
᪠á á¥ááá°á á ášáŽááᜠáá á á³áµáá, áá¥ááµá ááµ ášááá áµ ááá¥.
1.3. á ááá áááµ { ášáµááœá á°áá | áá£á}
áá ááá£á³ á áá ášá¥ á²áá¥á© áá¥ááµ á²á ááá á áá¶áá²á á£á áªá á¥áá²ááá¹ á«áµáœááá³áá¢
áá ON COMMIT DROP
á áµááµá ášáá áœáá«áá, á«ááá«á DROP TABLE
ᣠáá áš áá ON COMMIT DELETE ROWS
ááá³á ášá áá á áµá°á³áœ áá - á¥áá
ášá°áá áš áá TRUNCATE TABLE
.
ášááá«á á°áá ášá¥á áá³-ááá ááášáážáµ á á ááá áá ášá° áááµ ášáá°á á á áá ášá¥ áá á°áá³á³á áµááá ᣠášáá« ááá«á á°áá ášáŠáœá ášáá«ááᥠááá á á¥á áá°ášá ášáµáááµ á°áá ášáŠáœá áá° ášá£áµ "á¥á¥á áµ" á«áá«á pg_classᣠpg_á£á áªá£ 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. á¥ááŽáµ ááµá¬áµ áá»áá?
áµááá ááá¢á«áœá áá á áááµááá¢
- á ááᥠáá³á ááµá¥ ášá°ášááž ášá°áá á ááᥠá«áá á ášáŽá á áááµ 1M ááááŠáœ
- á ášáá á°áá á á á²áµ áááááá³á áá "ááµá"
- ášáá áá° áá ášáááµ á³áááá áš10áºá ášááá áá¡ ááááŠáœ á áá°áášá©áá¢
ášáá
áááá± ááá³ áááá°á áá³á ááá¢
3.1. áá ášááá³á°á á áááªáá
áááááᵠᣠááá¡á á¥áá°áá áááá á¥áá³á á á«áµáááááµá á¥áá á - á°áá ášá¡á áá°ááááá á ᜠá¥á» á«á áᡠᣠáááµá
- á áµáááµ ášá áá á áá ášáá ááá áá
- á ááá áá°á á²á ášáá á©áµá á¥á áááá á«áá áµ ááá áá
- á«áµáá¡ á¥áµá«áá á«áá°ášá°á° áá
ááááá¹ á áá
á
á°á á°ášá°á ááá áá°ášá á áá£ážá? áááá«á±á ášá ášáŽáá áá á á áµáá¹ ášáá«áµáá á áá
ááááµ áá (
áš dst á°áá
á á ᣠá á¥ááᥠá áááµ ááááᜠá¥á» ááááµ ááœáá-
- á áµáááµ (
DELETE
) á á á ááá ááá ááá - á«áµáá¡ ááá ášá á²á± ááµá
áá á á°áá³á³á áá á MVCC ááµáá ááá£áá ášá ášáŽáá áá á á áµááá áááµ áá áášáá«á! á 1áºá áá»á»á« áááá«áµ á á áá ášá¡ ááµá¥ áš+10á áááá¥áµ ááµááœá ááááµ á á£á á áµá«áááµ ááá¢
á áá«á dst
ášá áá áááµ á«áá ááᢠáááá á¡á£á á á£á áá«áœ á áá ááááµ ááœá³áµ á¥áá°áá»á á«áááá¢
- ááᜠ(
TRUNCATE
) áááá á ášáŽá - á«áµáá¡ ááá ášá á²á± ááµá
ááŽá áá€á³á áá,
á á áµ:
- á¥ášáááá ááᢠáášá á áá ášááá áá¥ááµ
TRUNCATE
á«áµááµá³á áá© áá³ášá»- áááµ- á¥á ááµáá£áµá áášá
á áá á¥áá°áááá ᣠá¥á á áá
áá ááá ááᜠá¥áá³á á ááœáá
SELECT
ášáá ááá á¥á© á áá°áá...
á áá ášá¥á áááá©âŠ á¥áá°áá áá°áá⊠/ á ášáŽáá á£áâŠ
á ááµ á áá«á áááá ááá á á°ááš á á²áµ á ášáŽá ááµá¥ ááááµ áá, á¥á ášáá« á ááá á á á®áá áŠá³ áá á¥áá°áá áá°áá. áááµ áá¥á áµááᜠááá®áœ;
- á ááá á¢áá áá© áá³ášá»ááá á¥áá³á áá á á£á á«áá° á¢ááá
- ášáá
á áá ášá¥ ááá ášáá áá
á¥á
á¶áœ/áµá³á²áµá²ááµ á³áá á°ááášááá£
áá°áá°á á«áµáááá - ááá ášáá áááᜠá°á°á¥ášáá (á€á.á¬.) áá° á ášáŽáá
ááµá«áµá ášáá áá ášá²áá áªááµ ášWIP patch áá áᢠ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
, á°ášá°áá ášáááµáá£á áµ.
ááá: hab.com