Как обновить таблицу, чтобы было только 1 значение с номером 1 - PullRequest
0 голосов
/ 04 апреля 2020

Допустим, у меня есть таблица, в которой есть столбцы user_id, car_id и selected. У одного пользователя может быть несколько машин, но он может выбрать только 1 по одному. Я могу обновить их значения, используя 2 разных вызова в БД, один, чтобы обновить выбранный автомобиль до 1, а затем 2-й вызов, чтобы обновить ранее выбранный автомобиль до 0, как бы я сделал это за 1 шаг?

UPDATE cars SET selected = 0 WHERE user_id = <id> AND selected = 1
UPDATE cars SET selected = 1 WHERE user_id = <id> AND car_id = <car_id>

- это вообще то, что у меня сейчас есть.

Ответы [ 4 ]

1 голос
/ 04 апреля 2020

Для обработки случая, когда пользователь выбирает уже выбранный автомобиль, я бы предложил:

UPDATE cars 
    SET selected = 1 - selected 
    WHERE user_id = <id> AND
          (selected = 1 OR car_id = <car_id>) AND
          NOT (selected = 1 AND car_id = <car_id>);

Примечание: Postgres поддерживает логический тип. Таким образом, вы могли бы также использовать его для логического значения. Если вы сделали:

UPDATE cars 
    SET selected = NOT selected 
    WHERE user_id = <id> AND
          (selected OR car_id = <car_id>) AND
          NOT (selected AND car_id = <car_id>);
1 голос
/ 04 апреля 2020

Вы можете использовать запрос UPDATE с выражением CASE, чтобы установить значение selected в соответствии с car_id. Например, чтобы установить выбранный автомобиль на 1 для user_id = 1:

UPDATE cars
SET selected = CASE WHEN car_id = 1 THEN 1 ELSE 0 END
WHERE user_id = 1

Демо на dbfiddle

1 голос
/ 04 апреля 2020

Избегайте ненужных обновлений, потому что нужно обновить только 2 строки:

  • строка, где car_id = <car_id> должен установить для столбца selected значение 1
  • , а текущая строка с selected = 1 должна быть установлена ​​на 0.

UPDATE cars 
SET selected = (car_id = <car_id>)::int
WHERE user_id = <id> AND (car_id = <car_id> OR selected = 1);

См. Упрощенную демонстрацию .

1 голос
/ 04 апреля 2020
UPDATE cars 
    SET selected = 1-selected 
    WHERE user_id = <id> 
    AND (selected = 1 OR car_id = <car_id>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...