MYSQL - 使用复合主键从另一个更新 table

MYSQL - update a table from another with composite primary key

我有一个不寻常的情况,我必须用另一个 table 的值更新一个 table,这两个 table 是相同的。

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    |       |
+-------------+----------+------+-----+---------+-------+

我需要用 table2 中存储的值更新 table1。

我尝试使用在 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 服务器版本对应的手册,了解在第 1

行 'FROM table2 AS t WHERE (f.timeStamp, f.obj_id) = (t.timeStamp,t.obj_id)' 附近使用的正确语法

查看 UPDATE 语句的 syntax,尤其是多个 table 语法。

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

我首先写了一个 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 作为将成为更新的 "target" 的 table 的别名,并使用 s 作为更新的别名"source".)

然后我通过用“UPDATE”关键字替换“SELECT ... FROM”,并在“[=”之前添加一个“SET”子句,将其转换为 UPDATE 语句17=]" 子句

 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 )