SQL - оновлення декількох записів в одному запиті


132

У мене є таблиця - config . Схема: config_name | config_value

І я хотів би оновити кілька записів в одному запиті. Я намагаюся так:

UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

але цей запит неправильний :(

Можеш допомогти мені?


1
Яку базу даних ви використовуєте?
Харт CO

Я використовую базу даних MySQL.
користувач3022527

Оновлення від Select може бути відповіддю stackoverflow.com/questions/2334712/…
Джонатан Бенн

Відповіді:


167

Спробуйте або синтаксис оновлення для багатьох таблиць

UPDATE config t1 JOIN config t2
    ON t1.config_name = 'name1' AND t2.config_name = 'name2'
   SET t1.config_value = 'value',
       t2.config_value = 'value2';

Ось демонстрація SQLFiddle

або умовне оновлення

UPDATE config
   SET config_value = CASE config_name 
                      WHEN 'name1' THEN 'value' 
                      WHEN 'name2' THEN 'value2' 
                      ELSE config_value
                      END
 WHERE config_name IN('name1', 'name2');

Ось демонстрація SQLFiddle


1
Так, це добре, але що, коли я хочу оновлювати 16 записів за один запит? Я повинен використовувати JOIN x 16?
користувач3022527

19
Ви повинні згадати такі важливі деталі у вашому запитанні в першу чергу. У будь-якому разі дивіться оновлену відповідь на інше рішення (умовне оновлення).
петерм

1
Що таке t1 і t2 у ваших прикладах?
Пол Бревчинський

1
Привіт і вам @PaulBrewczynski. Це псевдоніми таблиць і їх можна записати config AS t1там, де ASце необов’язково.
петерм

@peterm: посилання SQLFiddle розірвані. Інакше техніка умовного оновлення працює чудово. Дякую!
Джонатан Бенн

142

Ви можете виконати це за допомогою INSERT, як показано нижче:

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

Це вставляє нові значення в таблицю, але якщо первинний ключ дублюється (вже вставлений у таблицю), то вказані вами значення будуть оновлені, і той самий запис не буде вставлений другий раз.


26
досить розумний хак. Я вражений.
Блез

6
Чи не підтримується для Postgres см: stackoverflow.com/questions/1109061 / ...
kevzettler

Крім того, це чудовий спосіб перетворити трохи CSV (або багато) у вставку / оновлення / оновлення таблиці за допомогою незначного редагування тексту!
wulftone

6
Це рішення MySQL, а не Postgres або MSSQL.
Rz Mk

1
Це збільшить ідентифікатор автоматичного збільшення, навіть якщо запис не буде вставлено чи оновлено
Timo Huovinen

15

у моєму випадку я повинен оновлювати записи, яких понад 1000, для цього замість того, щоб натискати на запит оновлення кожен раз, коли я віддав перевагу цьому,

   UPDATE mst_users 
   SET base_id = CASE user_id 
   WHEN 78 THEN 999 
   WHEN 77 THEN 88 
   ELSE base_id END WHERE user_id IN(78, 77)

78,77 - це ідентифікатори користувачів, і для цих ідентифікаторів користувача мені потрібно оновити base_id 999 і 88 відповідно. Це працює для мене.


Один з найкращих тут, працював чудово для мене.
Шахрух Анвар

7

можливо, для когось це буде корисно

для Postgresql 9.5 працює як шарм

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
    (1, 1, 1, 'text for col4'),
    (DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
    col2 = EXCLUDED.col2,
    col3 = EXCLUDED.col3,
    col4 = EXCLUDED.col4

цей SQL оновлює існуючий запис і вставляє, якщо новий (2 в 1)


1
Як я бачу, ідентифікатор - це pk для таблиці згідно з вашим запитом. Припустимо, є 2 або більше стовпців, що розглядаються як pk (Складений ключ) ... У цьому випадку, яким повинен бути правильний спосіб перевірити конфлікт.
Sritam Jagadev

6

Рішення Каміля спрацювало. Перетворив його на основну функцію PHP, яка записує оператор SQL. Сподіваюсь, це допомагає комусь іншому.

    function _bulk_sql_update_query($table, $array)
    {
        /*
         * Example:
        INSERT INTO mytable (id, a, b, c)
        VALUES (1, 'a1', 'b1', 'c1'),
        (2, 'a2', 'b2', 'c2'),
        (3, 'a3', 'b3', 'c3'),
        (4, 'a4', 'b4', 'c4'),
        (5, 'a5', 'b5', 'c5'),
        (6, 'a6', 'b6', 'c6')
        ON DUPLICATE KEY UPDATE id=VALUES(id),
        a=VALUES(a),
        b=VALUES(b),
        c=VALUES(c);
    */
        $sql = "";

        $columns = array_keys($array[0]);
        $columns_as_string = implode(', ', $columns);

        $sql .= "
      INSERT INTO $table
      (" . $columns_as_string . ")
      VALUES ";

        $len = count($array);
        foreach ($array as $index => $values) {
            $sql .= '("';
            $sql .= implode('", "', $array[$index]) . "\"";
            $sql .= ')';
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= "\nON DUPLICATE KEY UPDATE \n";

        $len = count($columns);
        foreach ($columns as $index => $column) {

            $sql .= "$column=VALUES($column)";
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= ";";

        return $sql;
    }

5

замість цього

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

ви можете використовувати

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');

3

Виконайте наведений нижче код, щоб оновити n кількість рядків, де батьківський ідентифікатор - це ідентифікатор, з якого потрібно отримати дані, а дочірні ідентифікатори - ідентифікатори, які потребують оновлення, тому для оновлення потрібно просто додати батьківський ідентифікатор та дочірні ідентифікатори всі рядки вам потрібні, використовуючи невеликий сценарій.

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])

2

Якщо припустити, що у вас є список значень для оновлення в таблиці Excel з config_value у стовпці A1 та config_name у B1, ви можете легко записати запит туди, використовуючи формулу Excel, наприклад

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")


1

Виконайте наведений нижче код, якщо ви хочете оновити весь запис у всіх стовпцях:

update config set column1='value',column2='value'...columnN='value';

і якщо ви хочете оновити всі стовпці певного рядка, виконайте нижче код:

update config set column1='value',column2='value'...columnN='value' where column1='value'

3
що робити, якщо в різних рядках різняться значення? наприклад ОНОВЛЕННЯ персоналу SET зарплата = 1125 WHERE name = 'Bob'; ОНОВЛЕННЯ персоналу SET зарплата = 1200 WHERE name = 'Jane'; ОНОВЛЕННЯ персоналу SET зарплата = 1100 WHERE name = 'Frank'; ОНОВЛЕННЯ персоналу SET зарплата = 1175 WHERE name = 'Susan'; ОНОВЛЕННЯ персоналу SET зарплата = 1150 WHERE name = 'Джон';
Абдулла Нурум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.