Задавайте вопросы, мы ответим
Вы не зашли.
Привет всем!
Есть задача: нужно как-то сливать данные с одной таблицы (таб 1) в другую (таб 2) (структура таблиц идентичная). При этом нужно как-то сделать, чтобы при переносе данные которые будут вставляться в таблицу (таб 2) заменялись новыми данными - обновлялись. Таких таблиц, с которых данные будут переноситься в общую таблицу будет много.
Есть предположение использовать INSERT INTO pricedb SELECT * FROM import_puID;
Может быть вы что-то свое предложите?
Спасибо.
Неактивен
yuriy написал:
нужно как-то сделать, чтобы при переносе данные которые будут вставляться в таблицу (таб 2) заменялись новыми данными - обновлялись
Чем не подходит REPLACE?
Неактивен
Вы имеете ввиду использовать его в при обновлении таблицы
UPDATE tab SET name = REPLACE(name, ' old', 'new');?
Как же тогда получиться: если в таб.1, содержиться, к примеру, 1 000 000 записей, среди которых нужно обновить часть данных, данными таб.2. - насколько полное будет обновление?
Суть задума такова:
Есть общая таблица в которой находятся миллионы записей. И есть сотни небольших таблиц данные которых нужно сливать в общую таблицу, при этом нужно старые данные в общей таблице заменять новыми данными с других таблиц (тоисть постояно как-то обновлять общее хранилище поисковой таблицы - по ней будет производиться поиск).
Подскажите как можно такое реализовать?
Неактивен
Нет, подразумевалось
REPLACE INTO pricedb SELECT * FROM import_puID;
Неактивен
Не совсем подходит. Здесь происходит замена по ID ключу, если они совпадают тогда происходит замена, если нет добавляет дополнительную строку... у меня в общей табл. в которую должны сливаться данные с других таблиц нет первичного ключа по которому можно было бы совершать замену (это огромная таблица, по ней прозводиться поиск), посему такой вариант только будет добавлять новые строки не производя никакой замены.
Остается, наверное, только один способ:
1. перед вставкой строк удалить сроки из общей таблицы по внешнему ключу (fk - каждая запись относится к определенному пользователю).
2. затем делать вставки на основе запросов:
- INSERT INTO pricedb SELECT * FROM import_puID1; (это таблицы с которых необходимо перезалить данные в общую табл.)
- INSERT INTO pricedb SELECT * FROM import_puID2;
- INSERT INTO pricedb SELECT * FROM import_puID3;
...
и т.д.
Думаю понятно описал задачу, и ее решение возможно подлежит вашему вниманию!
Неактивен
yuriy, удалять, а потом вставлять - корректное решение. Но нужно проследить за тем, чтобы удаление не занимало слишком долго (таблица скорее всего будет заблокирована на время удаления). Возможно, следует удалять последовательными запросами записи, относящиеся к разным таблицам (если они чем-то отличаются).
Неактивен
rgbeast написал:
yuriy, удалять, а потом вставлять - корректное решение. Но нужно проследить за тем, чтобы удаление не занимало слишком долго (таблица скорее всего будет заблокирована на время удаления). Возможно, следует удалять последовательными запросами записи, относящиеся к разным таблицам (если они чем-то отличаются).
Вы имеете ввиду удалять записи частями? Для этого нужно написать скрипт (а может лучше хранимую процедуру або тригер) который будет заниматься удалением и вставкой данных в табл... тольк пока не знаю как это можно организовать...
Неактивен
Триггер не может удалять данные из той таблицы, к которой он относится.
Процедуру неудобно писать, и потом она ниоткуда не видна, если только про нее специально не помнить.
Лучше всего просто внешний (с точки зрения СУБД) запрос.
Неактивен