Как одним запросом обновить множество строк?

Рейтинг: 2Ответов: 1Опубликовано: 16.09.2014

С добавлением всех строк разобрался:

<?php
// массив записей для добавления в БД:
// $array_insert = array("('1','Anna','anna@mail.ru')",
// "('2','Oleg','oleg@yandex.ru')", ... );
$query = mysql_query("INSERT INTO `t1` (`id`, `name`, `email`) 
                      VALUES ".implode(",", $array_insert), $db);
?>

Вопрос:
$array_update - массив записей для обновления БД.
Как написать аналогичный запрос на UPDATE нескольких записей по выборочным id? Учитывая, что записей может обновляться порядка 10-ти штук за 1 раз...
Как должны выглядеть значения массива $array_update?

Обновление

Мне необходимо сделать апдейт следующим образом: у меня есть список уникальных id и, соответствующие каждому id, строки для апдейта (данные в строках могут повторяться). Необходимо одним запросом сделать апдейт всех строк, где поле id соответствует текущему id из списка. Почитал про INSERT ... ON DUPLICATE KEY UPDATE... пока не понимаю, как применить к моей ситуации.

Ответы

▲ 2

Если хотите использовать ON DUPLICATE KEY UPDATE, то вот пример, как это сделать. Тестировал на tutorialspoint.com:

MariaDB [(none)]> create database test_1;                                                                                                                                                                          
Query OK, 1 row affected (0.00 sec)                                                                                                                                                                                

MariaDB [(none)]> use test_1                                                                                                                                                                                       
Database changed                                                                                                                                                                                                   

MariaDB [test_1]> create table t1 (id INT NOT NULL AUTO_INCREMENT, name varchar(100), email varchar(100), PRIMARY KEY (id) );                                                                                      
Query OK, 0 rows affected (0.03 sec)                                                                                                                                                                               

MariaDB [test_1]> insert into t1 (name, email) values ('user1', 'user1@gmail.com'), ('user2', 'user2@gmail.com');                                                                                                  
Query OK, 2 rows affected (0.02 sec)                                                                                                                                                                               
Records: 2  Duplicates: 0  Warnings: 0                                                                                                                                                                             

MariaDB [test_1]> select * from t1;                                                                                                                                                                                
+----+-------+-----------------+                                                                                                                                                                                   
| id | name  | email           |                                                                                                                                                                                   
+----+-------+-----------------+                                                                                                                                                                                   
|  1 | user1 | user1@gmail.com |                                                                                                                                                                                   
|  2 | user2 | user2@gmail.com |                                                                                                                                                                                   
+----+-------+-----------------+                                                                                                                                                                                   
2 rows in set (0.01 sec)                                                                                                                                                                                           

MariaDB [test_1]> INSERT INTO t1 (id, name, email) VALUES (1, 'user1', 'new_email_user1@gmail.com'), (2, 'new_name', 'user2@gmail.com') ON DUPLICATE KEY UPDATE name = VALUES(`name`), email = VALUES(`email`);             
Query OK, 4 rows affected (0.01 sec)                                                                                                                                                                               
Records: 2  Duplicates: 2  Warnings: 0                                                                                                                                                                             

MariaDB [test_1]> select * from t1;                                                                                                                                                                                
+----+----------+---------------------------+                                                                                                                                                                      
| id | name     | email                     |                                                                                                                                                                      
+----+----------+---------------------------+                                                                                                                                                                      
|  1 | user1    | new_email_user1@gmail.com |                                                                                                                                                                      
|  2 | new_name | user2@gmail.com           |                                                                                                                                                                      
+----+----------+---------------------------+                                                                                                                                                                      
2 rows in set (0.00 sec)