【问题标题】:Replacing negative id's with correct positive Ids?用正确的正ID替换负ID?
【发布时间】:2019-03-05 14:31:32
【问题描述】:

我有两张桌子,itemsitems_archive。两者都有相同的列,您需要担心的唯一行是它们都有一个 id 行和一个时间戳行,这将用于帮助排序和替换 id。

问题来了,我最近从旧文本数据中恢复了一堆新行到items_archive。这个旧文本数据没有原始 id,所以我开始只是负数,以免影响任一表中的现有 id。但是,经过检查后,我发现事情实际上排列得非常完美,我想用正确的 id 替换负 id。

这是我当前的查询和数据的样子 -

SELECT * FROM (
SELECT idx,t_stamp, 'items' as src FROM items
UNION
SELECT idx,t_stamp, 'archive' as src FROM items_archive
) as t
ORDER BY t.t_stamp DESC;

生成这样的表格

id         t_stamp          src
==================================
1878    2018-09-08 09:54:40 pallets
1877    2018-09-08 09:02:58 pallets
1876    2018-09-07 16:07:45 pallets
-808    2018-09-06 09:53:39 archive
-801    2018-09-05 13:43:52 archive
1873    2018-09-05 13:00:32 archive
-800    2018-09-05 11:48:55 archive
1871    2018-09-05 11:05:13 archive

很明显,-808 应该是 1875,-801 应该是 1874,-800 应该是 1872。我怎样才能大规模实现呢?

我在想也许可以制作另一个临时表,其中包含从 min 到 max 的所有 id,以及基于我刚刚向您展示的表的顺序的时间戳。然后我可以加入时间戳并简单地更新存档表中的行。我可以使用 t_stamps 制作临时表,但是我不知道如何按照时间戳的顺序将新列中的 id 现在从 max 到 min 排序。我该怎么做?

或者,如果您能想到其他方法,请告诉我。我对这张小桌子(约 2k 行)的大量手动观察表明,底片非常适合。

使用 MySQL 5.6。

【问题讨论】:

  • 您为什么需要这样做? ids 不应该有任何意义,包括订购。
  • 相信我,我尝试向我的高级同事解释这一点。存在与另一个表相关的层次结构,该表使用更多恢复的数据引用这些 id,但我使关系存在。我个人不明白负 id 的问题是什么,但在我成为主管之前,这是我的工作。
  • "很明显,-808 应该是 1875,-801 应该是 1874,-800 应该是 1872。" 对我来说不是。
  • 这是下线。一切都是按顺序制造的,因此时间戳实际上就是制造产品的顺序。因此,如果 11:48:55 是第 1871 件产品,而下一个时间戳是负 id,那实际上是第 1872 件产品。我再次相信无论如何这都是毫无意义的,但这是我被告知要做的。

标签: mysql sql


【解决方案1】:

如您所说,制作一个带有时间戳的临时表并添加一个排序/索引列,例如

DENSE_RANK() OVER (Order by t_stamp) as myrank

然后您可以链接到该表进行更新。

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2015-04-03
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多