2

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

<?php
// массив записей для добавления в БД:
// $array_insert = array("('1','Anna','[email protected]')",
// "('2','Oleg','[email protected]')", ... );
$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... пока не понимаю, как применить к моей ситуации.

4
  • @lommusic, какое-то странное обновление, где нужно десяток записей изменять. Ощущение, что структура БД не совсем правильно составлена. Данные на обновление для всех записей одинаковы?
    – Deonis
    15 сен 2014 в 22:33
  • @Deonis Да. На самом деле это каталог объявлений, обновляющийся регулярно...
    – lommusic
    15 сен 2014 в 22:45
  • Запрос, как обычно, но условие или через OR, или IN: UPDATE table_name SET field = 'new_value' WHERE id IN (1,2,50, 100, N); Если вы говорили о каких-то массивах, то в данном случае - это может быть массивом id-шников: $query = "UPDATE table_name SET field = 'new_value' WHERE id IN (".implode(',', $array_id).")"; Кроме того, есть конструкция INSERT ... ON DUPLICATE KEY UPDATE, которую так же можно использовать для обновлений, при условии наличия уникальных/первичных ключей. Но в вашем случае, как я понял, этот способ не подойдет.
    – Deonis
    15 сен 2014 в 23:13
  • @Deonis мне необходимо сделать апдейт следующим образом: у меня есть список уникальных id и, соответствующие каждому id, строки для апдейта (данные в строках могут повторяться). Необходимо одним запросом сделать апдейт всех строк, где поле id соответствует текущему id из списка. Почитал про INSERT ... ON DUPLICATE KEY UPDATE... пока не понимаю, как применить к моей ситуации.
    – lommusic
    16 сен 2014 в 1:30

3 ответа 3

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', '[email protected]'), ('user2', '[email protected]');                                                                                                  
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 | [email protected] |                                                                                                                                                                                   
|  2 | user2 | [email protected] |                                                                                                                                                                                   
+----+-------+-----------------+                                                                                                                                                                                   
2 rows in set (0.01 sec)                                                                                                                                                                                           

MariaDB [test_1]> INSERT INTO t1 (id, name, email) VALUES (1, 'user1', '[email protected]'), (2, 'new_name', '[email protected]') 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    | [email protected] |                                                                                                                                                                      
|  2 | new_name | [email protected]           |                                                                                                                                                                      
+----+----------+---------------------------+                                                                                                                                                                      
2 rows in set (0.00 sec)
0

Если обновляемые значения для каждого из идентификаторов разные, к сожалению, обновить их одним запросом не получится. Для каждого из них придется выполнить свой отдельный UPDATE-запрос.

0

Иногда нужно обновить в таблице MySql n-ое количество строк. Причем вставить не одно значение, а несколько в зависимости от условия.

Запрос будет таким

UPDATE tbl_name  SET fld = CASE

WHEN pid=16 THEN '1'

WHEN pid=17 THEN '2'

WHEN pid=19 THEN '54'

ELSE fld END;

Причем если не поставить в конце ELSE fld, то все не подходящие по условию значения будут обнулены. Взято тут

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.