
SQL: семейный бюджет без догадок Урок 3 из 4
Сверка данных: найти пропуск до принятия решения
Проверяем бюджет контрольными равенствами, ищем дубли и осиротевшие связи, отличаем ограничение одной строки от правила для всей таблицы.
Зачем это нужно
Запрос без ошибки ещё не доказывает, что данные полны. Один дважды импортированный чек даст правдоподобный, но неверный итог.
Образ. Сверка — весы у выхода со склада: отдельно записи выглядят правильно, но общий вес должен совпасть с приходом и расходом.
Сразу целиком
SELECT happened_on, account_id, category_id, amount_tiyn, COUNT(*) AS copies
FROM transactions
GROUP BY happened_on, account_id, category_id, amount_tiyn, COALESCE(note, '')
HAVING COUNT(*) > 1;
Разбор
Дубликат определяется предметным правилом, а не только одинаковым id: у двух разных покупок могут совпасть дата и сумма. Поэтому запрос показывает кандидатов, а решение принимает человек или дополнительный устойчивый идентификатор импорта.
Внешний ключ защищает существование связанной строки, но только когда PRAGMA foreign_keys=ON. Проверка PRAGMA foreign_key_check; ищет уже существующие нарушения. PRAGMA integrity_check; проверяет структуру файла, но не знает, разумен ли семейный расход.
CHECK видит текущую строку. Правило «общие расходы не превышают доход» зависит от многих строк и времени; его проверяют отчётом и политикой приложения, а не случайным подзапросом в ограничении.
Контрольное равенство для бюджета: начальные остатки плюс доходы минус расходы должны совпасть с рассчитанным итогом по счетам. Если система хранит фактические банковские остатки, расхождение становится отдельным отчётом, а не исправляется молча.
Карта урока
Скажите своими словами
- Почему одинаковые поля дают только кандидата в дубликаты?
- Чем
integrity_checkотличается от предметной проверки? - Какое контрольное равенство использует бюджет?
Задание
Напишите два запроса: число операций и сумму расходов. Запомните результаты, затем вставьте копию одной операции из seed.sql с новым id и покажите, какие проверки заметили изменение. Точное повторение строки со старым id правильно завершилось бы ошибкой первичного ключа и не создало бы дубль.
Куда это встанет в проекте
Сверка выполняется перед публикацией отчёта и после импорта, чтобы технически успешная загрузка не стала тихой финансовой ошибкой.
Ответы
Показать ответы
SELECT COUNT(*) AS rows_total FROM transactions;
SELECT SUM(amount_tiyn) AS expense_tiyn
FROM transactions JOIN categories ON categories.id=category_id
WHERE kind='expense';
До повторной вставки ожидаются 8 строк и 12 780 000 тиынов расхода. После вставки с новым id изменятся оба контрольных значения, а запрос поиска кандидатов в дубликаты покажет две похожие операции.
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.