Дополнительно
Несколько обновлений в MySQL
Я знаю, что Вы можете вставить несколько рядов сразу, есть ли способ обновить несколько рядов сразу (как в в одном вопросе) в MySQL?
Отредактируйте: Например, у меня есть следующее
Name id Col1 Col2
Row1 1 6 1
Row2 2 2 3
Row3 3 9 5
Row4 4 16 8
Я хочу объединить все следующие Обновления в один вопрос
UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;
363
17
Да, that' s возможный - Вы можете использовать ВСТАВКУ... НА ДВОЙНОМ КЛЮЧЕВОМ ОБНОВЛЕНИИ.
Используя Ваш пример:
Так как у Вас есть динамические ценности, Вы должны использовать ЕСЛИ или СЛУЧАЙ для колонок, которые будут обновлены. Это становится довольно ужасным, но это должно работать.
Используя Ваш пример, Вы могли сделать это как:
< pre> Настольный приемник ОБНОВЛЕНИЯ Col1 = id СЛУЧАЯ КОГДА 1 ТОГДА 1 КОГДА 2 ТОГДА 2 КОГДА 4 ТОГДА 10 ЕЩЕ Col1 КОНЕЦ, Col2 = id СЛУЧАЯ КОГДА 3 ТОГДА 3 КОГДА 4 ТОГДА 12 ЕЩЕ Col2 КОНЕЦ ГДЕ id В (1, 2, 3, 4);Вопрос стар, все же I' d нравится расширять тему с другим ответом.
Мой пункт, самый легкий способ достигнуть его состоит в том, чтобы только обернуть несколько вопросов сделкой. Принятый ответ 'ВСТАВКА... НА ДВОЙНОМ КЛЮЧЕВОМ ОБНОВЛЕНИИ' Хорошее хакерское проникновение, но нужно знать о его недостатках и ограничениях:
Я сделал некоторые промышленные испытания для трех из предложенных вариантов, включая 'ВСТАВКУ... НА ДВОЙНОМ КЛЮЧЕ ОБНОВЛЯЮТ' Вариант, вариант с " случай / когда / then" пункт и наивный подход со сделкой. Вы можете получить кодекс питона и результаты [здесь] (https://gist.github.com/imankulov/5849790). Полное заключение состоит в том, что вариант с заявлением случая оказывается дважды с такой скоростью, как два других варианта, но it' s довольно трудно, чтобы написать правильный и безопасный от инъекции кодекс для него, таким образом, я лично придерживаюсь самого простого подхода: использование сделок.
Отредактируйте: Результаты [Dakusan] (https://stackoverflow.com/users/698632/dakusan) доказывают, что мои исполнительные оценки не совсем действительны. Пожалуйста, см. [этот ответ] (https://stackoverflow.com/a/39831043/848010) для другого, более тщательно продуманного исследования.
Не уверенный, почему другой полезный выбор еще не упомянут:
Все следующее относится к InnoDB.
Я чувствую знание, что скорости 3 различных методов важны.
Есть 3 метода:
Я просто проверил это, и метод ВСТАВКИ был 6.7x быстрее для меня, чем ОПЕРАЦИОННЫЙ метод. Я примерил ряд и 3 000 и 30 000 рядов.
ОПЕРАЦИОННЫЙ метод все еще должен бежать, каждый индивидуально подвергает сомнению, который занимает время, хотя он комплектует результаты в памяти или чем-то, выполняя. ОПЕРАЦИОННЫЙ метод также довольно дорогой и в повторении и в регистрациях вопроса.
Еще хуже, метод СЛУЧАЯ был 41.1x медленнее, чем отчеты метода w/30,000 ВСТАВКИ (6.1x медленнее, чем СДЕЛКА). И 75x медленнее в MyISAM. ВСТАВКА и методы СЛУЧАЯ стали безубыточным в ~1 000 отчетах. Даже в 100 отчетах, метод СЛУЧАЯ ЕДВА быстрее.
Так в целом я чувствую, что метод ВСТАВКИ является и лучшим и самым легким использовать. Вопросы меньше и легче читать и только поднять 1 вопрос действия. Это относится и к InnoDB и к MyISAM.
Бонусный материал:
Решение для проблемы ВСТАВКИ «не область по умолчанию» состоит в том, чтобы временно выключить соответствующие способы SQL: 'СЕССИЯ НАБОРА sql_mode=REPLACE (ЗАМЕНЯЮТ (@@ Сессия sql_mode, " STRICT_TRANS_TA BLES" " "), " STRICT_AL L_TABLES" " ")'. Удостоверьтесь, что спасли 'sql_mode' сначала, если Вы планируете возвращение его.
Что касается других комментариев I' ve, замеченный, которые говорят auto_increment, повышается, используя метод ВСТАВКИ, я проверил тот также, и это, кажется, не имеет место.
Кодекс, чтобы запустить тесты следующие. Это также продукция.SQL файлы, чтобы удалить php переводчика наверху
Используйте временный стол
Это должно работать на Вас.
Есть ссылка в руководство MySQL для нескольких столов.
Почему не делает никакого упоминания несколько заявлений в одном вопросе ?
В php Вы используете 'multi_query' метод mysqli случая.
От php руководство
Вот является результат по сравнению с другими 3 методами в обновлении 30 000 сырья. Кодекс может быть найден здесь, который основан на ответе от @Dakusan
Сделка: 5.5194580554962< br> Вставка: 0.20669293403625< br> Случай: 16.474853992462< br> Много: 0.0412278175354< br>
Как Вы видите, несколько вопросов заявлений более эффективны, чем самый высокий ответ.
Если Вы получаете сообщение об ошибке как это:
Вы, возможно, должны увеличить 'max_allowed_packet' в mysql файле конфигурации, который в моей машине является '/etc/mysql/my.cnf', и затем перезапустите mysqld.
Вы можете псевдоним тот же стол, чтобы дать Вам id' s Вы хотите вставить (если Вы делаете обновление ряда рядом:
Кроме того, должно казаться очевидным, что Вы можете также обновить от других столов также. В этом случае обновление удваивается как " SELECT" заявление, давая Вам данные из стола Вы определяете. Вы явно заявляете в своем вопросе ценности обновления так, второй стол незатронут.
Есть урегулирование, Вы можете изменить названный ' много statement' это отключает MySQL' s ' безопасность mechanism' осуществленный, чтобы предотвратить (больше чем один) команду инъекции. Типичный к MySQL' s ' brilliant' внедрение, это также препятствует тому, чтобы пользователь делал эффективные вопросы.
Здесь (http://dev.mysql.com/doc/refman/5.1/en/mysql-set-server-option.html) некоторая информация о внедрении C урегулирования.
Если you' ре используя PHP, Вы можете использовать mysqli, чтобы сделать много заявления (я думаю, что php отправил с mysqli некоторое время теперь),
Надежда, которая помогает.
Вы можете также интересоваться использованием соединений на обновлениях, который возможен также.
Отредактируйте: Если ценности, которые Вы обновляете, являются not' t прибывающий из где-то в другом месте в базе данных, you' ll должен выпустить несколько вопросов обновления.
использовать
Пожалуйста, отметьте:
Следующее обновит все ряды в одном столе
Следующий обновит все ряды, где ценность Column2 - больше чем 5
Есть весь Unkwntech' s пример обновления больше чем одного стола
Да.. это - возможная ВСТАВКА использования НА sql заявлении ОБНОВЛЕНИЯ ДВОЙНОГО КЛЮЧА.. синтаксис: ВСТАВКА В table_name (a, b, c) ЦЕННОСТИ (1,2,3), (4,5,6) НА ДВОЙНОМ КЛЮЧЕ ОБНОВЛЯЮТ a=VALUES (a), b=VALUES (b), c=VALUES (c)
С PHP я сделал это. Используйте точку с запятой, разделите ее на множество и затем подчинитесь через петлю.
Это должно достигнуть что you' r поиск. Просто добавьте больше id' s. Я проверил его.
//Вы просто строительство его в php как
Таким образом, Вы можете обновить стол отверстия с одним вопросом