powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Модификация одной таблицы по данным из второй таблицы
12 сообщений из 12, страница 1 из 1
Модификация одной таблицы по данным из второй таблицы
    #38520115
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброй ночи, коллеги!

Буду благодарен, если подскажете идею.

Есть некая таблица Table1 с неключевыми полями F1 и F2. Каждая строка этой таблицы имеет уникальный ключ.
Формируем другую таблицу Table2 с одним неключевым полем F1, в которой каждая строка имеет уникальный ключ.
Необходимо выполнить объединение этих двух таблиц:
1. во всех строках Table1, которые по уникальному ключу имеют соответствующие строки из Table2, заменить значение поля F1 на значение поля F1 из строк Table2
2. во всех строках Table1, которые по уникальному ключу НЕ имеют соответствия в Table2, обнулить поле F1
3. добавить в Table1 новые строки из Table2, которых по ключу нет в Table1. При этом поле F2=0.
4. удалить из Table1 строки, в которых оба поля F1 и F2 одновременно равны нулю или NULL

Я описал алгоритм примерно так, как я эту задачу решал на десктопной базе - минимизация операций модификации Table1.
Table2 формировалась в памяти.

Сейчас хочу этот алгоритм оптимизировать к sql-базе. Table2 планирую формировать в хранимке как временную на движке MEMORY.
Обращаю внимание, что просто заменить Table1 на Table2 нельзя из-за того, что в Table1 кроме поля F1 есть еще поле F2, которое не присутствует в Table2!

Пока вижу решение, которое, имхо, не совсем подходит для sql-базы:
1. обходим курсором Table1, "дергаем" по ключу Table2 и меняем значение поля F1 в Table1 в зависимости от результата "дергания" Table2. Одновременно удаляем из Table2 запись, которая "выдернулась".
2. добавляем в Table1 все оставшиеся записи из Table2, заполняя поле F2 NULL-ем:
Код: sql
1.
INSERT INTO Table1 (F1,F2) SELECT T2.F1, NULL FROM Table2 AS T2


3. выполняем:
Код: sql
1.
DELETE FROM Table1 WHERE (IFNULL(F1,0)+IFNULL(F2,0))=0


В этом алгоритме мне совершенно не нравится пункт 1!
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38520118
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дополнение к первому посту.

Что "легче" для сервера - удаление строк из временной таблицы или изменение зачения одного поля?
Т.е., если модифицировать пункты 1 и 2 из окончательного алгоритма:
1. Вместо удаления "выдернутой" записи Table2 просто выставить значение поля Del=1
2. Добавлять из Table2 не все строки, а только строки с Del=0. Да еще и сразу проверять поле F1:
Код: sql
1.
INSERT INTO Table1 (F1,F2) SELECT T2.F1, NULL FROM Table2 AS T2 WHERE (T2.Del = 0) AND (IFNULL(T2.F1) > 0)



В принципе, остается оптимизация пункта 1 - как одним запросом изменить записи Table1 на такие-же (по ключу) записи из Table2?
Точнее - не полностью запись, а только одно ее поле F1.
Если такой запрос удастся составить, то тогда прийдется еще и сочинить запрос для пункта 2 - добавить в Table1 записи из Table2, которых (по ключу) нет в Table1.

В общем - буду благодарен конструктивным идеям!
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38520152
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlegROAобходим курсором Table1, "дергаем" по ключу Table2 и меняем значение поля F1 в Table1 в зависимости от результата "дергания" Table2. Одновременно удаляем из Table2 запись, которая "выдернулась".жесть какая :)
Давайте по пунктам
OlegROA1. во всех строках Table1, которые по уникальному ключу имеют соответствующие строки из Table2, заменить значение поля F1 на значение поля F1 из строк Table2
2. во всех строках Table1, которые по уникальному ключу НЕ имеют соответствия в Table2, обнулить поле F1
Код: sql
1.
2.
update t1 left join t2 on t1.key=t2.key 
 set t1.f1=ifnull(t2.f1,0)


OlegROA3. добавить в Table1 новые строки из Table2, которых по ключу нет в Table1. При этом поле F2=0.2 варианта - либо вычистить из т2 всё, чего нет в т1
Код: sql
1.
delete t2.* from t2 join t1 on t2.key=t1.key

, а потом просто инсерт всего оставшегося, подменив f2 на ноль. Либо сразу
Код: sql
1.
2.
insert into t1 (key,f1,f2) select t2.key,t2.f1,0 
from t2 left join t1 on t1.key=t2.key where t1.key is null


OlegROA4. удалить из Table1 строки, в которых оба поля F1 и F2 одновременно равны нулю или NULLНеужели у вас даже с этим есть сложности? Про функцию ifnull и оператор and не знаете?
OlegROAЧто "легче" для сервера - удаление строк из временной таблицы или изменение зачения одного поля?OlegROATable2 планирую формировать в хранимке как временную на движке MEMORY .Ну сами подумайте, что легче - долбить диск или обращаться к ОП?
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521046
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirOlegROA4. удалить из Table1 строки, в которых оба поля F1 и F2 одновременно равны нулю или NULLНеужели у вас даже с этим есть сложности? Про функцию ifnull и оператор and не знаете?
Вы, вероятно, не совсем внимательно прочитали мои два сообщения - в SQL-алгоритме решения (пункт 3) я этот запрос как раз и написал.
tanglirOlegROAЧто "легче" для сервера - удаление строк из временной таблицы или изменение зачения одного поля?OlegROATable2 планирую формировать в хранимке как временную на движке MEMORY .Ну сами подумайте, что легче - долбить диск или обращаться к ОП?Никакого "долбления" диска нет - я рассматривал все эти операции во временной таблице! Понятно, что если вся временная таблица помещается в памяти, то разница во времени между UPDATE и DELETE будет ничтожной.
Поэтому этот вопрос я задал в общем, применительно к обычным InnoDB-таблицам - что в них менее "напряжно" для сервера и быстрее - UPDATE или DELETE?

А за алгоритм решения - большое спасибо!

Правда, все равно получаем три пункта, в которых каждый раз приходится серверу полностью читать или сразу обе таблицы или, как минимум, одну из таблиц:
Код: sql
1.
2.
3.
1. UPDATE table1 LEFT JOIN table2
2. INSERT INTI table1 ... SELECT ... FROM table2 LEFT JOIN table1
3. DELETE FROM table1

Второй пункт можно не учитывать - производится чтение временной таблицы в ОП.
А вот первый и третий предполагают чтение всей InnoDB-таблицы дважды!

В моем старом алгоритме для десктопной базы удаление и обновление Table1 выполнялось за один проход.
Неужели никак нельзя совместить UPDATE с DELETE - указать серверу что бы обе операции выполнялись за один обход этой таблицы?

Спасибо!
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521104
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первые два пункта можно объединить (insert ... on duplicate key update) - впрочем, не думаю, что это выгодно. А вот третий пункт всегда будет отдельным. Хотя внешне можно сделать это в одну строку - хранимой процедурой.
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521105
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlegROAВ моем старом алгоритме для десктопной базы удаление и обновление Table1 выполнялось за один проход.
Да ладно... на MySQL?
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521160
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaOlegROAВ моем старом алгоритме для десктопной базы удаление и обновление Table1 выполнялось за один проход.Да ладно... на MySQL?Нет, конечно! Десктопная база - обычный "движек" типа Btrieve или DBF - Topspeed. Обычное хранилище данных с ключами/индексами. Вся логика - в клиентской программе.
Алгоритм обработки таких баз чем-то напоминает курсоры в SQL. Или, скорее всего, HANDLER в MySQL.
Выборка, если можно так сказать, формируется за счет ключей/индексов - обходим только записи, попавшие в нужный ключ.
Ну, и здесь сразу в зависимости от условий или изменяем запись или удаляем ее.
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521228
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlegROAприменительно к обычным InnoDB-таблицам - что в них менее "напряжно" для сервера и быстрее - UPDATE или DELETE?когда как :) теоретически удаление вроде бы должно быть быстрее, но всё зависит от обстоятельств.

OlegROAНеужели никак нельзя совместить UPDATE с DELETEЭто 2 разных оператора, более того - 2 разных, практически противоположных по сути действия. Как вы хотите их "совместить"?

AkinaПервые два пункта можно объединить (insert ... on duplicate key update)Там загвоздка в том, что t1.f2 должно в одном случае зануляться, а в другом получать значение из t2.f2. У меня не получилось впихнуть это всё в один запрос. Хотел надуть мускль dummy-переменными в списке полей (вставляем по дефолту 0 в f2, исходную f2 - в переменную, по совпадению ключа апдейтим f2), но эта фишка поддерживается только в load data, похоже.
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521663
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirТам загвоздка в том, что t1.f2 должно в одном случае зануляться, а в другом получать значение из t2.f2. У меня не получилось впихнуть это всё в один запрос
В смысле что-то типа
Код: sql
1.
2.
update t1 left join t2
set t1.f2 = case when t2.f1 is null then 0 else t2.f2 end 


?
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521675
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

ну да, я выше такой апдейт и написал.
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38521989
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что тогда не получилось? что-то я не понимаю тебя...
...
Рейтинг: 0 / 0
Модификация одной таблицы по данным из второй таблицы
    #38522966
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
в том, что ТС хотел одним оператором сделать и инсерт, и апдейт
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Модификация одной таблицы по данным из второй таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]