Вставка PostgreSQL с вложенным запросом завершается неудачно с большим количеством строк - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь вставить данные в таблицу PostgreSQL, используя вложенный оператор SQL. Я обнаружил, что мои вставки работают с небольшими (несколько тысяч) строками, возвращаемыми из вложенного запроса. Например, когда я пытаюсь:

insert into the_target_table (a_few_columns, average_metric)

    SELECT a_few_columns, AVG(a_metric)
    FROM a table
    GROUP BY a_few_columns LIMIT 5000)

Однако этот же запрос завершается неудачно, когда я удаляю свой LIMIT (внутренний запрос без ограничения возвращает около 30000 строк):

ОШИБКА: целое число вне диапазона

a_metric - это двойная точность, а a_few_columns - текст. Я поиграл со строками LIMIT, и кажется, что число строк, которые он может вставить без ошибки, составляет 14 000. Я не знаю, является ли это недетерминированным или постоянным пороговым значением до появления ошибки.

Я просмотрел несколько других сообщений SO по этой теме, , включая эту , и изменил тип данных первичного ключа моей таблицы на BIGINT. Я все еще получаю ту же ошибку. Однако я не думаю, что это проблема с переполнением чисел, поскольку число вставок, которые я делаю, мало и даже близко не достигает порога.

У кого-нибудь есть какие-либо подсказки, что вызывает эту ошибку?

1 Ответ

0 голосов
/ 04 июля 2018

Проблема заключалась в неправильном определении поля avg_metric в моей таблице, в которое я хотел вставить его. Я случайно определил это как целое число. Обычно это не большая проблема, но у меня также было несколько значений бесконечности (inf). Как только я переключил свой тип данных поля на двойную точность, я смог успешно вставить. Конечно, было бы лучше, если бы мое приложение предварительно проверило конечные значения перед попыткой вставки - обычно я делал бы это программно с помощью утверждений, но с вложенным запросом я не удосужился проверить.

Последний запрос, который я использовал, был

вставить в таблицу_целей (a_few_columns, средняя_метрика)

SELECT a_few_columns, CASE WHEN AVG(a_metric) = 'inf' THEN NULL ELSE AVG(a_metric) END
FROM a_table
GROUP BY a_few_columns LIMIT 5000)

Еще лучшим решением было бы пройти через a_table и заменить сначала все значения inf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...