Към съдържанието
wannacode

Пекарната, етап 6: отчетът, копието и DROP

Накратко: Последният етап прави отчет с прозоречни функции, копие на базата с VACUUM INTO и маха всичко с DROP в правилния ред.

Проблем

Месецът свърши

Октомври приключи. Пекарната иска отчет: как растат приходите ден по ден, кой е най-добрият клиент и какъв дял от парите идва от него. После иска копие на базата, преди да започне нов сезон. А ти, за да видиш целия път, ще махнеш базата парче по парче, докато не стане празна, както в началото на етап 1.

Полетата тръгват от базата след етап 5: данните, индексът, изгледът order_totals, тригерът take_stock и колоната phone.

Идеята

Натрупаната сума

Прозоречна функция смята стойност от няколко реда, без да ги слива в един. SUM(t.total) OVER (ORDER BY o.ordered_at) е сумата на всички поръчки до този ред включително:

SQLпразна база

Така се вижда как месецът расте до 47 €, без отказаната поръчка.

Пробвай

Отчетът

Отчет по клиенти, без отказаните поръчки: името, похарченото (spent), делът от всички приходи в проценти (share, закръглен до 1 знак) и мястото в класирането (place, с RANK). Подреди по място. Сумите вземи от изгледа order_totals.

SQLпразна база
По-точно, за любопитните

RANK дава еднакво място на равните и прескача следващото (1, 1, 3). DENSE_RANK не прескача (1, 1, 2), а ROW_NUMBER дава различни номера дори на равните.

Идеята

Копието

Преди голяма промяна (нов сезон, миграция, внос на данни) се прави копие. VACUUM INTO записва цялата база в нов файл, докато тя работи, а ATTACH отваря копието като втора база до първата:

SQLпразна база

Шестте поръчки и петте таблици са и в копието.

Пусни полето втори път и VACUUM INTO спира: файлът вече го има. Така е и в истинската работа: всяко копие е нов файл с датата в името.

По-точно, за любопитните

В PostgreSQL копието се прави отвън: pg_dump bakery > bakery-2026-10-31.sql и връщане с psql. Копие, което никой не е пробвал да върне, не е копие.

Виж го

Какво зависи от какво

Изгледът order_totals чете от order_items. Ако таблицата изчезне първа:

SQLпразна база

Изгледът остава, но вече сочи към нищо. Индексите и тригерите на таблица изчезват с нея, изгледите не. Затова първо се махат изгледите. PostgreSQL е по-строг: там DROP TABLE спира, докато има изглед, който чете от таблицата.

Пробвай

Изгледът, тригерът и индексът

Махни изгледа order_totals, тригера take_stock и индекса orders_customer.

SQLпразна база

Виж го

Родителят първи

Таблица, към която други сочат, не може да изчезне, докато има редове, които сочат към нея:

SQLпразна база

DROP TABLE първо трие всички редове, а външният ключ в orders не дава да изчезнат клиенти с поръчки.

Упражнение

Празна база

Махни петте таблици така, че нито един DROP да не спре с грешка. Накрая в базата не бива да остане нищо.

SQLпразна база
По-точно, за любопитните

orders преди order_items също минава, но по случайност: ON DELETE CASCADE изтрива редовете на поръчките, преди таблицата да изчезне. Без CASCADE същият ред спира. Сигурният ред е винаги от децата към родителите. В PostgreSQL DROP TABLE … CASCADE маха и всичко, което зависи от таблицата: удобно и опасно.

Идеята

Целият път

Базата е празна, както в началото. По пътя:

  1. Етап 1: петте CREATE TABLE с ключове, NOT NULL, UNIQUE, CHECK, DEFAULT и CASCADE.
  2. Етап 2: INSERT, RETURNING, транзакция с BEGIN и COMMIT, ROLLBACK и INSERT … SELECT.
  3. Етап 3: въпросите с JOIN, LEFT JOIN, GROUP BY, WITH и COALESCE.
  4. Етап 4: UPDATE, DELETE и upsert, с правилата, които спират грешното.
  5. Етап 5: индекс, изглед, тригер и ALTER TABLE.
  6. Етап 6: отчет с прозорци, копие с VACUUM INTO и DROP.

На твоя компютър последната стъпка е изтриването на файла bakery.db. В PostgreSQL е DROP DATABASE bakery;, пуснато от друга база, докато никой не е свързан към нея.

Тест

Провери се

1. Каква е разликата между SUM(t.total) с GROUP BY и SUM(SUM(t.total)) OVER ()?
2. Защо DROP TABLE customers спира с грешка, докато има поръчки?
3. Изтриваш таблицата order_items. Какво става с изгледа order_totals?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·