Как осуществить массовый UPDATE or INSERT в MySQL через Drupal Database API?
У меня есть массив на 10000 элементов. Если какого то элемента в таблице нет, то нужно его вставить, а если он уже там, то обновить. Получается нужно 10000 инсертов или апдейтов. Можно это как то объединить? Цикл на 10000 апдейтов кажется мне очень плохой идеей. Подскажите как правильно это реализовать, пожалуйста.
Точного ответа не скажу. Расскажу как я столкнулся с похожей проблемой.
При переносе сайта на другую тему, почему то я потерял 2 поля (точнее содержимое полей, которое это поле должно было выводить), через них я выводил код гугла адсенса. И что бы не открывать 300 нод и вставлять в каждую код адсенса в 2 поля. Я снова открыл эти поля, добавил код в Что выводить если поле пустое (там в настройках поля). Потом через модуль Rules сделал, что если пересохранить ноду, то появляется это содержимое. т.е. мне пришлось, просто руками открыть-сохранять ноды. Хорошо что их не так много. В вашей проблеме это наверно наркомания. Может и есть модуль или настройки в Rules что автоматом пересохранились ноды. Честно, не искал решение, т.к. решил и сделал руками.
2 проблема была с целым полем. Поле просто исчезло. Я открыл бд где было это поле, выделил, нажал экспорт, зашел на новый сайт, добавил через импорт в бд. Все получилось.
Может что нибудь поможет или направит на путь истинный.
Александр Пупкин: пока, чтобы не делать 10000 апдейтов, каждый раз очищаю таблицу, циклом формирую огромный инсэрт и вставляю его в db_query. Каждый раз очищать таблицу конечно очень плохо, но так хоть один инсэрт получается и ничего лучшего пока не придумал(
Я понимаю что вас тянет к упрощению. Но иногда приходиться и по работать руками. Попробуйте как я вам писал, скачать поле и т.п. и сколько останется не сделанных, добавить руками =) Скиньте посмотреть что вы там чудите.
Или попробуйте задать вопрос в теге SQL или как правильно он тут называется. По размышление моей пустой головы,можно что нибудь придумать типа условия.
INSERT INTO "поле" ("какие то поля/значения") VALUES ("что вставляем");
if (empty $field):
INSERT INTO "поле" ("какие то поля/значения") VALUES ("что вставляем");
Ну что то типо этого но не то =) Может там кто нибудь направит на истину.
Максим Федоров Не подскажете еще как применить ON DUPLICATE KEY UPDATE ко всем записям? Если, например, в таблице 100 совпадений, то как записать ON DUPLICATE KEY UPDATE?
Вот на это
INSERT INTO `test1`(`name`, `price1`, `price2`, `price3`, `price4`) VALUES ('title 1',6,6,6,6), ('title 2',7,7,7,7) ON DUPLICATE KEY UPDATE (price1=6,price2=6,price3=6,price4=6), (price1=7,price2=7,price3=7,price4=7)
mysql говорит
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(price1=6,price2=6,price3=6,price4=6), (price1=7,price2=7,price3=7,price4=7)' at line 1
Максим Федоров Еще один вопрос возник. Можно ли обновить все записи разными значениями или нужно писать для каждой записи отдельный апдейт с указанием id?