mysql - 用正确的正 ID 替换负 ID?

标签 mysql sql

我有两个表,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。我怎样才能大规模实现这一目标?

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

或者,如果您能想到其他方法,请告诉我。我对这张小 table (约 2000 行)的大量手动观察表明底片完美地安装到位。

使用 MySQL 5.6。

最佳答案

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

DENSE_RANK() OVER (Order by t_stamp) as myrank

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

关于mysql - 用正确的正 ID 替换负 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55005154/

相关文章:

mysql - 在mysql if语句中使用别名

mysql - 使用 WHERE...IN 更新多行

sql - COALESCE 在 Where 子句中?

sql - 如何强制 Entity Framework 4.0 生成与其对应的数据库列大小相等的参数

sql - Postgres : UPDATE statement has no effect

c# - 使用 C# 构建的 Web 服务,用于从 mySQL 数据库中检索数据

php - 在 Laravel 4 模型上使用 setConnection

mysql - Highstock mysql json比较多个系列

c# - 使用 Dapper 和 Npgsql2 插入空值数组属性的问题

mysql - Left Join 基于字段值