ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ содСрТимому
ΠœΠ°ΠΊΡΠΈΠΌΠ΅Ρ‚Π΅Ρ€

πŸ”₯ SQL-Π·Π°Π΄Π°Ρ‡Π° с опасным ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ

πŸ”₯ SQL-Π·Π°Π΄Π°Ρ‡Π° с опасным ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ Какой баланс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ послС выполнСния запроса Π² PostgreSQL? CREATE TABLE accounts ( id int PRIMARY KEY, balance int ); CREATE TABLE operations ( account_id int, amount int ); INSERT INTO accounts VALUES (1, 100); INSERT INTO operations VALUES (1, 10), (1, 20); UPDATE accounts a SET balance = a.balance + o.amount FROM operations o WHERE o.account_id = a.id; МногиС отвСтят 130, Π½ΠΎ PostgreSQL ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ строку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ 110 ΠΈΠ»ΠΈ 120. Если цСлСвая строка соСдиняСтся с нСсколькими строками ΠΈΠ· FROM, PostgreSQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½ΠΈΡ…, Π½ΠΎ ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ, Π½Π΅ гарантируСтся. ➑️ ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: UPDATE accounts a SET balance = a.balance + x.total FROM ( SELECT account_id, SUM(amount) AS total FROM operations GROUP BY account_id ) x WHERE x.account_id = a.id; Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС accounts соотвСтствуСт Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½Π° строка источника, Π° баланс станСт 130.

263 просмотров

Канал Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠœΠ°ΠΊΡΠΈΠΌΠ΅Ρ‚Π΅Ρ€Π°

3Β 653 подписчиков Β· IT ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Π»Π°

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Π»Π°

Π•Ρ‰Ρ‘ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Β«IT ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΒ»

Π§ΠΈΡ‚Π°Ρ‚ΡŒ дальшС

Π”Π²Π° Ρ€Π°Π·Π° Π² нСдСлю свСТиС посты этого ΠΊΠ°Π½Π°Π»Π° β€” Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ ΠΈ Π² Π»ΠΈΡ‡Π½ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ. Π‘Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ поиска ΠΊΠ°Π½Π°Π»Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.