Как обновить несколько записей в таблице одним запросом? (PostgreSQL) - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть таблица с названием группы животных.

Это выглядит так:

image_1

Предположим, вы хотите обновить данные дляgroups.

  • Теперь в записи с group_id = 2 значение quantity изменяется с 2 на 1.
  • В записи с group_id = 3, different_aviaries изменяется с false на true.
  • В записи с group_id = 4 значение group_name изменяется на null, аколичество до 0.

Результат должен быть таким:

image_2

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

PS Я значительно упростил таблицу в примере. На самом деле, может потребоваться обновить 40 записей одновременно. Кроме того, столбцы в таблице из Примера 5, но на самом деле их 14.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Да, это можно сделать на нативном SQL. Но с ORM или изначально это плохая идея, особенно с 40 строками и 14 столбцами. Если это однократная операция, просто напишите отдельные обновления. Это было бы намного более безопасным вариантом, потому что чем больше вероятность ошибки, тем больше увеличивается. Если это не однократная операция, то нет ничего предсказать эту изменчивость заранее;так что каждый становится единовременным. Но это может быть сделано;Только не:

update animal_groups
   set quantity = case when group_id = 2 then 1
                       when group_id = 4 then 0 
                       else quantity
                  end
     , different_aviaries = case when group_id = 3 then true
                                 else different_aviaries
                            end
     ,  group_name = case when group_id = 4 then null
                          else group_name
                     end                      
 where group_id in (2,3,4);

Обратите внимание, что обновление количества должно учитывать оба изменения значения, поскольку имя столбца может быть ЛЕВОЙ ЗНАЧЕНИЕМ только один раз в выписке.

0 голосов
/ 05 ноября 2019

Вы можете использовать пакет Laravel Batch . Из файла readme:

use App\Models\User;

$userInstance = new User;
$value = [
     [
         'id' => 1,
         'status' => 'active',
         'nickname' => 'Mohammad'
     ] ,
     [
         'id' => 5,
         'status' => 'deactive',
         'date' => Carbon::now()
     ] ,
];
$index = 'id';

Batch::update($userInstance, $value, $index);

Вы можете легко настроить его для решения вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...