- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Переиграть и победить: как анализировать конкурентов для продвижения сайта
С помощью Ahrefs
Александр Шестаков
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть такая задачка, две таблицы, примерно одинаковые по сути:
tb1 (id, id2, id3, value)
tb2 (id, id2=tb1.id, id3, value)
т.е. вторая увязана с первой.
При этом id - в обоих случаях уникален, и в том числе уникальна комбинация id2+id3
получаю массив данных в виде: tb1(id2, id3, value), tb2(id2, id3, value).
т.е. все есть - кроме ключевых id.
Нужно (обновить поля) ИЛИ (добавить их если не существуют) в обе таблицы.
Размышляю:
1. управлять полями можно через WHERE id2 AND id3 - но это путь для одной записи.
2. Вставить ЛИБО обновить можно через INSERT INTO ... ON DUPLICATE KEY UPDATE ...
но оно для одной записи.
3. Обновить "пачку" можно через UPDATE SET id = case ... но это не решает проблему добавления.
Надеюсь не путано объяснил...
Короче пухнет головенка - как ОДНИМ ЗАПРОСОМ обновить ЛИБО добавить сразу множество записей в таблицу или в две, при условии что обращаться к записи нужно по двум полям одновременно.
А почему нельзя добавлять по одной записе в цикле (и так сколько угодно раз)?
А почему нельзя добавлять по одной записе в цикле (и так сколько угодно раз)?
Допустим! Вопрос остается: как ЛИБО добавить ЛИБО заменить, если мы не знаем уникального индекса, а имеем только набор из id2 и id3.
Т.е. зная id2, id3 можно произвести замену: UPDATE ... WHERE ...
но если такая комбинация не встречается, т.е. нет записи с id2=ХХХ, id3=YYY, что делать?
Вам возможно помогут конструкции:
UPDATE ... WHERE id not in (SELECT id FROM ...)
INSERT INTO ... (SELECT .... FROM ... WHERE id not in (SELECT id FROM ...))
xmrz как?
т.е. если б можно было:
UPDATE ... WHERE ... [OR INSERT INTO ...]
тогда да... но так ведь не получится.
согласен, это придётся делать в два запроса. Например - сперва добавить данные которых нет, а потом обновить которые изменились
согласен, это придётся делать в два запроса. Например - сперва добавить данные которых нет, а потом обновить которые изменились
тогда в три - нужен еще SELECT который подскажет нам какие записи уже есть...
Вот этого то и хочется избежать. Иначе сначала надо выбрать массив SELECTом - сравнить массивы, разделить исходный на (добавляем/обновляем) - и потом начать процесс. А если записей несколько миллионов? Тоже так же страдать?
Зачем три?
Хватит двух. Вот эта конструкция WHERE id not in (SELECT id FROM ...) позволит избежать третьего запроса. Когда я решал задачу массовой вставки данных в mysql с миллионами записей пришёл к выводу что дешевле создать ошибку PRIMARY KEY чем предварительно проверять, нет ли такой записи, быстрее выходит в разы :)
xmrz добавил 16.02.2009 в 11:56
да, предварительно рекомендуется вставить данные во временные таблички, а потом уже ими оперировать
malls, а чем REPLACE не устраивает в такой ситуации, он же как раз по уникальному ключу работает?
Зачем три?
Хватит двух. Вот эта конструкция WHERE id not in (SELECT id FROM ...) позволит избежать третьего запроса. Когда я решал задачу массовой вставки данных в mysql с миллионами записей пришёл к выводу что дешевле создать ошибку PRIMARY KEY чем предварительно проверять, нет ли такой записи, быстрее выходит в разы :)
проблема в том что у меня на момент добавления НЕТУ id, есть только вторичные ключи!
Например:
Т.е. у меня есть значения:
(Петя , характер , исправился)
(Коля , характер , пива выпил) add
(Петя , лицо , задумчивое) add
(Вася , лицо , книжку прочитал)
(Миша , лицо, удивленное) add
соответственно надо некоторые поля добавить ( add), а некоторые изменить. Сочетание id2+id3 ВСЕГДА УНИКАЛЬНО! Но ключа id нету на момент добавления!
malls, а чем REPLACE не устраивает в такой ситуации, он же как раз по уникальному ключу работает?
тем и не устраивает!
Сочетание id2+id3 ВСЕГДА УНИКАЛЬНО!
<...>
тем и не устраивает!
Не понимаю. id2+id3 - уникален. Следовательно, при использовании REPLACE:
1. (Петя , характер , исправился) - запись будет замещена;
2. (Миша , лицо, удивленное) - запись будет создана.