«
»
WEBWEB - PHPWordPressWordPress - SQL

Массовое обновление вставки в MySQL с использованием PHP

Иногда нам нужно вставить большой набор данных в таблицу базы данных. Существует несколько способов массовой вставки данных в таблицу MySQL.

Использование одного оператора INSERT на строку довольно неэффективен. Вместо этого мы можем собрать один оператор INSERT с несколькими строками.

Сегодня я собираюсь показать, как выполнить массовую вставку в таблицу MySQL с помощью PHP.

MySQL запрос для вставки нескольких строк

Операторы INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждый из которых заключен в скобки и разделен запятыми.

Следующий запрос вставляет несколько строк.

INSERT INTO tbl_name (a,b,c) VALUES (1,2,3), (4,5,6), (7,8,9);

Источник

Массовая вставка с использованием PHP

Вы можете использовать PHP, чтобы подготовить оператор MySQL для вставки нескольких строк, а также выполнить этот запрос.

Конкатенация PHP может быть использована для построения запроса. Вот простой фрагмент.

<?php $total_rows = 1000000; $batch_id = 1; $query = "INSERT INTO tbl_coupons (batch_id, code) VALUES "; $values = ''; for($i = 1; $i <= $total_rows; $i++){ // Create string with random characters $coupon_code = echo chr(rand(65,90)) . chr(rand(65,90)) . chr(rand(65,90)) . chr(rand(65,90)) . chr(rand(65,90)); $values .= "('$batch_id', '$coupon_code'),"; } $values = substr($values, 0, strlen($values) - 1); $this->db->query($query); ?>

Вышеуказанный фрагмент вставляет несколько строк. Кроме того, вы также можете использовать функцию implode(), чтобы избежать конкатенации строк.

Однако в этом фрагменте есть серьезный недостаток. Настоящая проблема возникает, когда в таблице много столбцов, а длина запроса превышает значение max_allowed_packet в mysql . Вы можете столкнуться с предупреждением следующим образом:

Warning: Error while sending QUERY packet. PID=33735

Чтобы проверить ‘max_allowed_packet’, вы можете просто выполнить следующую инструкцию.

SHOW VARIABLES LIKE 'max_allowed_packet';

Чтобы избежать этого, вы можете построить внутренний цикл для запуска запроса. Вот как это сделать:

<?php $total_rows = 1000000; $batch_id = 1; $insert_limit = 1000; $query = "INSERT INTO tbl_coupons (batch_id, code) VALUES "; $values = ''; for($i = 1; $i <= $total_rows; $i++){ // Create string with random characters $coupon_code = echo chr(rand(65,90)) . chr(rand(65,90)) . chr(rand(65,90)) . chr(rand(65,90)) . chr(rand(65,90)); $values .= "('$batch_id', '$coupon_code'),"; if($i % $insert_limit == 0) { $values = substr($values, 0, strlen($values) - 1); $insert_query = $query . $values; $this->db->query($insert_query); $values = ''; } } $values = substr($values, 0, strlen($values) - 1); $this->db->query($query); ?>

До сих пор мы узнали, как выполнить массовую вставку, используя несколько операторов INSERT. Однако это не лучший способ вставить объемные данные.

Если вам не нужно манипулировать данными перед их вставкой, вы всегда можете использовать mysql ‘ LOAD DATA . Даже если вам нужно манипулировать данными перед вставкой, вы можете сгенерировать CSV-файл после манипуляции и вставить, используя LOAD DATA .

Массовое обновление

Для массового обновления вы можете использовать конструкцию ON DUPLICATE KEY UPDATE. Запрос будет выглядеть следующим образом:

INSERT INTO `table_name` (id, col) VALUES (1, 'val1'), (2, 'val2'), (3, 'val3') ON DUPLICATE KEY UPDATE col = VALUES(col);

Мы можем легко построить подобный тип запроса, используя PHP. Позволяет использовать массив , содержащий ключевое значение для создания запроса. Вот фрагмент.

<?php $coupons = array( 1 => 'ABCDE', 2 => 'GHIJK', 3 => 'EFGHI', 4 => 'RSTUV', 5 => 'VWXYZ', ); $data = array(); foreach ($coupons AS $key => $value) { $data[] = "($key, '$value')"; } $query = "INSERT INTO `tbl_coupons` (id, code) VALUES " . implode(', ', $data) . " ON DUPLICATE KEY UPDATE code = VALUES(code)"; $this->db->query($query); ?>

Кроме того, вы можете использовать конструкцию CASE в операторе UPDATE. Тогда запрос будет выглядеть примерно так:

UPDATE tbl_coupons SET code = (CASE id WHEN 1 THEN 'ABCDE' WHEN 2 THEN 'GHIJK' WHEN 3 THEN 'EFGHI' END) WHERE id IN(1, 2 ,3);

Таким образом, мы можем вставить и обновить несколько строк в таблицу MySQL, используя PHP.

Связанные записи
WEBПолезные сайты

50 бесплатных сайтов для ваших проектов графического дизайна в 2020 году | Бесплатные Графика, Фото и Видео стоки, Шрифты, Макеты и не только

WoocommerceWordPressПлагины

WooCommerce - быстро удалите все варианты продукта - WP Sheet Editor

WoocommerceWordPressПлагины

WordPress - Массовое удаление продуктов и атрибутов WooCommerce из базы данны SQL

FacetWPWoocommerceWordPressПлагины

FacetWP + WooCommerce полезные примеры кода для двух популярных плагинов WordPress