使用复合主键从另一个表更新表

3b6akqbq  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(458)

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

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

我需要用表2中存储的值更新表1。
我尝试了一些有用的信息,所以。。。
经过几次尝试,我提出了这样一个查询:

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\u id)=(t.timestamp,t.obj\u id)”

oaxa6hgo

oaxa6hgo1#

看看update语句的语法,尤其是多表语法。

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

wz1wpwve2#

我首先编写一个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 作为“源”的别名
然后我通过替换“ 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 )

相关问题