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

时间:2018-10-15 16:47:04

标签: mysql sql-update composite-primary-key

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

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语法有错误;在第1行的'FROM table2 AS t WHERE(f.timeStamp,f.obj_id)=(t.timeStamp,t.obj_id)'附近检查与MySQL服务器版本相对应的手册以使用正确的语法

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我首先编写一个SELECT语句,该语句显示要替换的现有值以及新值。这使我可以测试表达式,并直观地验证结果,例如

null

(我通常将 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用作“源”的别名。)

然后我将其转换为UPDATE语句,方法是将“ s替换为“ SELECT ... FROM”关键字,并在“ {{1}”之前添加“ UPDATE”子句}“条款

SET