用正确的正ID替换负ID?

时间:2019-03-05 14:31:33

标签: mysql sql

我有两个表itemsitems_archive。两者都具有相同的列,您唯一需要担心的是它们都具有id行和timestamp行,这两个行将用于帮助订购和替换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年。我如何大规模地实现这一点?

我在想也许要制作另一个临时表,该表具有从最小到最大的所有ID,并根据我刚刚显示的表按顺序排列时间戳。然后,我可以加入时间戳记,并只需更新存档表中的行。我可以用t_stamps制作临时表,但是我不知道如何按照时间戳的顺序在新列中从max到min排序id。我该怎么办?

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

使用MySQL 5.6。

1 个答案:

答案 0 :(得分:1)

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

DENSE_RANK() OVER (Order by t_stamp) as myrank

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