【问题标题】:MYSQL - update a table from another with composite primary keyMYSQL - 使用复合主键从另一个表更新表
【发布时间】:2018-10-15 16:47:04
【问题描述】:

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

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 到现在都没有运气:(

错误是最常见的错误: ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“FROM table2 AS t WHERE (f.timeStamp, f.obj_id) = (t.timeStamp,t.obj_id)”附近使用正确的语法

【问题讨论】:

  • 这并不罕见。这基本上是复制。但是,您不能简单地编造语法。

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


【解决方案1】:

我首先编写一个 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”关键字,并在“WHERE”子句之前添加“SET”子句,将其转换为 UPDATE 语句

 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 )

【讨论】:

  • 我喜欢您的代码通过在实际 UPDATE 语句之前选择要更新的数据来提供控制感的方式,也感谢分享!
  • @Deiv:这就是我使用的方法。我不够聪明,无法在不先将其写为 SELECT 的情况下编写多表更新。我喜欢确认条件和值……让我有机会在运行 UPDATE 之前检查结果。
【解决方案2】:

看看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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多