MySQL: Обновите столбец на основе членства в не обновляемом представлении

#mysql #sql-update #inner-join #distinct #exists

Вопрос:

У меня есть столбец в таблице, который я хочу установить в значение true или false на основе условий в другой таблице, которая связана только с первой таблицей через третью таблицу. Первая таблица представляет собой таблицу развертываний, вторая таблица содержит сообщения для каждого развертывания (много сообщений на развертывание), а третья таблица содержит msg_data, которые поступают только из определенных сообщений. Не все развертывания будут включать сообщения data_msg, но если они будут, я хочу установить для столбца в таблице развертывания значение TRUE. Я создал представление таблицы, в котором показаны все строки, в которых для этого столбца должно быть установлено значение true:

 CREATE VIEW condition_true AS
SELECT DISTINCT deployment.id, deployment.condition
FROM deployment
JOIN messages ON messages.deployment_id = deployment.id
JOIN data_msgs ON data_msgs.messages_id = messages.id
GROUP BY deployment.id;
 

Это представление само по себе не подлежит обновлению по нескольким причинам, но, очевидно, я хотел бы сделать следующее

 UPDATE condition_true
SET condition_true.condition = TRUE;
 

Кто-нибудь может помочь мне понять, как этого добиться?
Спасибо.

Ответ №1:

Предполагая , что id это первичный ключ deployment , вам нужна UPDATE инструкция с объединениями 3 таблиц:

 UPDATE deployment d
JOIN messages m ON m.deployment_id = d.id
JOIN data_msgs dm ON dm.messages_id = m.id
SET d.condition = true
 

Или, с EXISTS :

 UPDATE deployment d
SET d.condition = true
WHERE EXISTS (
  SELECT 1 
  FROM messages m JOIN data_msgs dm 
  ON dm.messages_id = m.id
  WHERE m.deployment_id = d.id
)
 

Или, если вы хотите установить для столбца значение TRUE или FALSE :

 UPDATE deployment d
SET d.condition = EXISTS (
  SELECT 1 
  FROM messages m JOIN data_msgs dm 
  ON dm.messages_id = m.id
  WHERE m.deployment_id = d.id
) 
 

Кроме того, на ваш взгляд, в этом нет необходимости GROUP BY deployment.id , потому что вы не выполняете никакой агрегации и используете DISTINCT , поэтому вы не получите никаких повторяющихся строк..

Комментарии:

1. Спасибо, это отлично работает, хотя я столкнулся с проблемой размера таблицы блокировки, которую мне теперь нужно решить.

2. @Kat Проверьте мой 2-й запрос.

3. Спасибо вам за дополнительные техники, это очень полезно. Я просто изучаю SQL.