|
|
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
Доброй ночи, коллеги! Буду благодарен, если подскажете идею. Есть некая таблица 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. 3. выполняем: Код: sql 1. В этом алгоритме мне совершенно не нравится пункт 1! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 04:10:56 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
В дополнение к первому посту. Что "легче" для сервера - удаление строк из временной таблицы или изменение зачения одного поля? Т.е., если модифицировать пункты 1 и 2 из окончательного алгоритма: 1. Вместо удаления "выдернутой" записи Table2 просто выставить значение поля Del=1 2. Добавлять из Table2 не все строки, а только строки с Del=0. Да еще и сразу проверять поле F1: Код: sql 1. В принципе, остается оптимизация пункта 1 - как одним запросом изменить записи Table1 на такие-же (по ключу) записи из Table2? Точнее - не полностью запись, а только одно ее поле F1. Если такой запрос удастся составить, то тогда прийдется еще и сочинить запрос для пункта 2 - добавить в Table1 записи из Table2, которых (по ключу) нет в Table1. В общем - буду благодарен конструктивным идеям! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 04:30:22 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
OlegROAобходим курсором Table1, "дергаем" по ключу Table2 и меняем значение поля F1 в Table1 в зависимости от результата "дергания" Table2. Одновременно удаляем из Table2 запись, которая "выдернулась".жесть какая :) Давайте по пунктам OlegROA1. во всех строках Table1, которые по уникальному ключу имеют соответствующие строки из Table2, заменить значение поля F1 на значение поля F1 из строк Table2 2. во всех строках Table1, которые по уникальному ключу НЕ имеют соответствия в Table2, обнулить поле F1 Код: sql 1. 2. OlegROA3. добавить в Table1 новые строки из Table2, которых по ключу нет в Table1. При этом поле F2=0.2 варианта - либо вычистить из т2 всё, чего нет в т1 Код: sql 1. , а потом просто инсерт всего оставшегося, подменив f2 на ноль. Либо сразу Код: sql 1. 2. OlegROA4. удалить из Table1 строки, в которых оба поля F1 и F2 одновременно равны нулю или NULLНеужели у вас даже с этим есть сложности? Про функцию ifnull и оператор and не знаете? OlegROAЧто "легче" для сервера - удаление строк из временной таблицы или изменение зачения одного поля?OlegROATable2 планирую формировать в хранимке как временную на движке MEMORY .Ну сами подумайте, что легче - долбить диск или обращаться к ОП? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 07:41:19 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
tanglirOlegROA4. удалить из Table1 строки, в которых оба поля F1 и F2 одновременно равны нулю или NULLНеужели у вас даже с этим есть сложности? Про функцию ifnull и оператор and не знаете? Вы, вероятно, не совсем внимательно прочитали мои два сообщения - в SQL-алгоритме решения (пункт 3) я этот запрос как раз и написал. tanglirOlegROAЧто "легче" для сервера - удаление строк из временной таблицы или изменение зачения одного поля?OlegROATable2 планирую формировать в хранимке как временную на движке MEMORY .Ну сами подумайте, что легче - долбить диск или обращаться к ОП?Никакого "долбления" диска нет - я рассматривал все эти операции во временной таблице! Понятно, что если вся временная таблица помещается в памяти, то разница во времени между UPDATE и DELETE будет ничтожной. Поэтому этот вопрос я задал в общем, применительно к обычным InnoDB-таблицам - что в них менее "напряжно" для сервера и быстрее - UPDATE или DELETE? А за алгоритм решения - большое спасибо! Правда, все равно получаем три пункта, в которых каждый раз приходится серверу полностью читать или сразу обе таблицы или, как минимум, одну из таблиц: Код: sql 1. 2. 3. Второй пункт можно не учитывать - производится чтение временной таблицы в ОП. А вот первый и третий предполагают чтение всей InnoDB-таблицы дважды! В моем старом алгоритме для десктопной базы удаление и обновление Table1 выполнялось за один проход. Неужели никак нельзя совместить UPDATE с DELETE - указать серверу что бы обе операции выполнялись за один обход этой таблицы? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 21:00:47 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
Первые два пункта можно объединить (insert ... on duplicate key update) - впрочем, не думаю, что это выгодно. А вот третий пункт всегда будет отдельным. Хотя внешне можно сделать это в одну строку - хранимой процедурой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 22:16:16 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
OlegROAВ моем старом алгоритме для десктопной базы удаление и обновление Table1 выполнялось за один проход. Да ладно... на MySQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 22:17:02 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
AkinaOlegROAВ моем старом алгоритме для десктопной базы удаление и обновление Table1 выполнялось за один проход.Да ладно... на MySQL?Нет, конечно! Десктопная база - обычный "движек" типа Btrieve или DBF - Topspeed. Обычное хранилище данных с ключами/индексами. Вся логика - в клиентской программе. Алгоритм обработки таких баз чем-то напоминает курсоры в SQL. Или, скорее всего, HANDLER в MySQL. Выборка, если можно так сказать, формируется за счет ключей/индексов - обходим только записи, попавшие в нужный ключ. Ну, и здесь сразу в зависимости от условий или изменяем запись или удаляем ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 00:37:25 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
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, похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 05:23:33 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
tanglirТам загвоздка в том, что t1.f2 должно в одном случае зануляться, а в другом получать значение из t2.f2. У меня не получилось впихнуть это всё в один запрос В смысле что-то типа Код: sql 1. 2. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 12:07:47 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
Akina, ну да, я выше такой апдейт и написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 12:14:41 |
|
||
|
Модификация одной таблицы по данным из второй таблицы
|
|||
|---|---|---|---|
|
#18+
а что тогда не получилось? что-то я не понимаю тебя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 14:37:52 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38521105&tid=1835423]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
53ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 369ms |

| 0 / 0 |
