Я понимаю, что вопрос зависит от поставщика, но спросите, могу ли я беспокоиться, работает ли агрегатная функция, например, SUM
на небольшом типе?Что произойдет, если SQL sum() достигнет типа емкости (переполнения)?
Например, MariaDB использует 4 байта для типа INT
. Разработчики могут предположить, что каждая транзакция имеет сумму не более нескольких тысяч.
Но что произойдет, если мы попытаемся получить доход в течение целого года для всех отделов? Например .:
-- CREATE TABLE income (dt DATETIME, department INT, amount INT);
SELECT SUM(amount) FROM income WHERE dt BETWEEN '2014-01-01' and '2014-12-31'
Это выглядит стремно увеличение размера памяти только для устранения переполнения проблемы с агрегатной функцией SUM
.
О чем я должен беспокоиться? Существуют ли какие-либо гарантии или пояснения по стандартам SQL 92/99/2008?
Есть ли какая-либо специальная поддержка от JDBC-драйверов?
Должен ли я переписать выбрать в виде:
SELECT SUM(CAST(amount AS BIGINT)) FROM income
WHERE dt BETWEEN '2014-01-01' and '2014-12-31'
Я думаю, что вы ответили на свой вопрос. Да, это зависит от поставщика, и помощь в этом случае будет полезной. Не могли бы вы переполнить bigint? теоретически. Поэтому вам нужно, основываясь на данных, которые вы будете хранить, не могли бы вы переполнить это. – DBug
@a_horse_with_no_name Спасибо за исправление! Если SQL Server обработчик переполнения, что я должен делать на стороне клиента? Я должен выбрать более крупный тип данных в коде клиента JDBC/ODBC? – gavenkoa
На стороне клиента вы должны принять это во внимание, да. –