MYSQL - обновить таблицу из другого с составным первичным ключом - PullRequest
0 голосов
/ 15 октября 2018

У меня необычная ситуация, когда мне приходится обновлять таблицу значениями из другой, две таблицы идентичны.

Table 1 and Table 2
+-------------+----------+------+-----+---------+-------+
| Field       | Type     | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| timeStamp   | datetime | NO   | PRI | NULL    |       |
| obj_id      | int(10)  | NO   | PRI | NULL    |       |
| value       | double   | YES  |     | NULL    |       |
+-------------+----------+------+-----+---------+-------+

И мне нужно обновить table1 значениями, хранящимися в table2.

Я попытался с некоторой полезной информацией, найденной здесь, на SO ...

после нескольких попыток, я пришел к такому запросу:

UPDATE table1 AS f  
    SET table1.value = t.value 
FROM table2 AS t 
WHERE (f.timeStamp, f.obj_id) = (t.timeStamp,t.obj_id);

ofc безуспешно до сих пор: (

ошибка наиболее распространенная: ОШИБКА 1064 (42000): у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, дляправильный синтаксис для использования рядом с «ИЗ таблицы2 КАК ГДЕ (f.timeStamp, f.obj_id) = (t.timeStamp, t.obj_id)» в строке 1

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Сначала я пишу инструкцию SELECT, которая показывает существующие значения, подлежащие замене, а также новые значения.Это позволяет мне проверять выражения и визуально проверять результаты, например

 SELECT t.obj_id
      , t.timestamp 
      , t.value      AS old_value
      , s.value      AS new_value
   FROM table1 s
   JOIN table2 t 
     ON t.timestamp = s.timestamp
    AND t.obj_id    = s.obj_id
  WHERE NOT ( t.value <=> s.value )

(я обычно использую t в качестве псевдонима для таблицы, которая будет «целью» обновления, и использую s в качестве псевдонима для "source".)

Затем я преобразую его в инструкцию UPDATE, заменив "SELECT ... FROM" на ключевое слово "UPDATE" и добавив "SET«предложение перед« WHERE »

 UPDATE table1 s
   JOIN table2 t 
     ON t.timestamp = s.timestamp
    AND t.obj_id    = s.obj_id
    SET t.value = s.value
  WHERE NOT ( t.value <=> s.value )
0 голосов
/ 15 октября 2018

Посмотрите синтаксис для оператора UPDATE, особенно синтаксис нескольких таблиц.

UPDATE table1 f 
JOIN table2 t
    ON f.timeStamp = t.timestamp AND f.obj_id = t.obj_id
    SET f.value = t.value;
...