Сохранение изменений MariaDB

114
20 сентября 2021, 12:40

Как сохранить результат запроса в таблицу?

SELECT row_number() OVER w as one, two, three, four FROM mytable WINDOW w AS (ORDER BY one, two, three, four)
Answer 1

Если имеется готовый и дающий правильный результат запрос на выборку

SELECT (что-то)
FROM (откуда-то)

и существует задача сохранить результат такого запроса в некую уже имеющуюся таблицу, достаточно преобразовать его в запрос на добавление данных, добавив в начало блок

INSERT INTO имеющаяся_таблица (список полей)
SELECT (что-то)
FROM (откуда-то)

Какие следует соблюсти мелочи?

  1. Список полей в имеющемся SELECT и в добавляемом INSERT должны точно совпадать по порядку (нельзя менять порядок, даже если имена "накрест" совпадают - имена полей при добавлении игнорируются, работает только номер поля в записи). Тем более - совпадать по количеству. Если в запросе полей нехватает - добавьте в список вывода литералов до требуемого. Это проще, чем надеяться на DEFAULT-значения (кроме автоинкремента, конечно, если он не приходит из запроса), и более контролируемо.

  2. Тип поля, в которое помещается значение в части INSERT, должен иметь возможность принять тип, который имеет соответствующее поле в SELECT. Либо оно должно туда поместиться после неявного преобразования (например, сервер легко преобразует дату в текст). Также надо следить по длине значения (если итоговый текст длинноват - сервер его обрежет, правда, выдаст предупреждение), и не забывать о точности. Помните и о том, что timestamp - он с зоной времени. Ну и так далее. Если прямого соответствия нет, настоятельно рекомендую не надеяться на неявное преобразование от сервера, а подкорректировать список вывода в SELECT. Например, если нужно поместить строковое значение поля num в поле числового типа, то лучше заменить SELECT num, ... на SELECT num+0, ... (или, скажем, SELECT CAST(num AS DECIMAL(16, 6)), ... - по потребности).

  3. Отдельно для тех полей-приёмников, для которых в поле-источнике может оказаться NULL, проверьте, определено ли это поле как NULLable. Если нет - либо измените свойства поля в таблице, либо замените NULL на иное значение функцией COALESCE либо IFNULL.

  4. Отдельная песня - кодировки текста. Ну тут можно только посоветовать быть максимально внимательным. И, как в пункте 2, при малейшем подозрении на косяк - явно использовать функцию CONVERT.

Ну и помните, что при наличии в таблице-приёмнике автоинкремента его надо переинициализировать на новое значение, в соответствии с уже имеющимся максимальным значением. Простым ALTER TABLE. Иначе следующая вставка в таблицу может закончиться крахом.

READ ALSO
Свой шрифт в Тильде html-блок

Свой шрифт в Тильде html-блок

Нужна помощь/советМне необходимо в конструкторе сайтов https://tilda

181
Что такое замыкания в JS?

Что такое замыкания в JS?

Лексическое окружение понятно, а как понять замыкания в JSКакую функцию она выполняет

172
Не работает событие onclick

Не работает событие onclick

сразу же извиняюсь, если ошибка была глупойЕсть изображение, при нажатии на него, див с ид фильтр должен становиться блочным

114