如何将查询结果添加到列中

时间:2017-12-30 01:20:10

标签: java mysql unix

我有以下查询返回一列值:

SELECT CONCAT(
  from_unixtime(lastSaleTime/1000, '%Y-%d-%m %h:%i:%s.'),
  CAST(EXTRACT(MICROSECOND FROM from_unixtime(lastSaleTime/1000))/1000 
  AS SIGNED)
) FROM IEX_Tick;

如何将此列复制到同一个表中的现有列?

1 个答案:

答案 0 :(得分:1)

我相信子查询可以做到:

UPDATE IEX_Tick SET SomeColumn = (
   SELECT CONCAT(
       from_unixtime(lastSaleTime/1000, '%Y-%d-%m %h:%i:%s.'),
       CAST(EXTRACT(MICROSECOND FROM from_unixtime(lastSaleTime/1000))/1000 AS SIGNED)
   ) FROM IEX_Tick;
)

修改
(响应this comment

在做了一些研究之后,我发现即使上面建议的解决方案有效SQL,也不支持更新MySQL中的表格。

我从Stack Overflow上的各个相关帖子收集的信息(例如thisthis)表明MySQL限制了这些类型的UPDATE查询:

  

...因为您的更新可能是周期性的...如果更新该记录会导致某些事情发生,导致WHERE条件为FALSE会怎么样?你知道情况并非如此,但引擎却没有。在操作中桌面上也可能存在相反的锁定。

因此,有助于避免MySQL设置的任意限制的可行替代方法是使用另一个子查询,这次是在FROM子句中,如下所示:

UPDATE IEX_Tick SET SomeColumn = (
   SELECT CONCAT(
       from_unixtime(lastSaleTime/1000, '%Y-%d-%m %h:%i:%s.'),
       CAST(EXTRACT(MICROSECOND FROM from_unixtime(lastSaleTime/1000))/1000 AS SIGNED)
   ) FROM (
       SELECT * FROM IEX_Tick AS SomeName
   );
)

注意:我个人会避免使用SELECT * FROM IEX_Tick,尤其是IEX_Tick有很多列时。我优化子查询的好方法是只使用所需的列。