在MySQL表中更改行顺序的最佳方法?

ghhkc1vu  于 2023-03-22  发布在  Mysql
关注(0)|答案(3)|浏览(424)

我有一个MySQL表,表中的行需要按照用户决定的特定顺序进行排序,换句话说,需要用户能够在表中的随机点插入新行,并将现有行移动到选择查询的表输出中的新随机位置/行号......
到目前为止我想到的解决方案:
1.我可以使用一个整数和一个ORDER BY,但是,我需要更新“插入”点之后的每一行。
1.我可以使用时间戳和索引整数,将新行的索引整数设置为等于当前占用插入点的行的索引整数,然后在查询中首先按索引顺序,然后按时间戳顺序,但是当我想将旧行移动到新索引时,“更新所有”问题仍然发生,而不是插入新行。

nue99wik

nue99wik1#

一般来说,关系数据库最基本的一点是数据的顺序(存储)完全无关紧要。
如果希望按特定顺序检索数据,则select数据,并在order-by子句中指定所需的顺序。
如果你想一直指定这个顺序,你可能想创建一个视图,并在视图的定义中指定一个顺序(如果你在指定了自己的order by子句的视图上执行select,这仍然可以被覆盖)。
如果你真的总是(或几乎总是)以特定的顺序从该表中检索所有数据,你可能想按该顺序创建一个聚集索引。这可以/将(通常)帮助按该顺序检索数据。

rt4zxlrg

rt4zxlrg2#

@Jerry说的是真的,表中数据的顺序并不重要,重要的是关联或相关的数据。
例如,如果您试图记录某些事件的时间,则需要包含该时间的列:

item    time
----    ----
one     01:00
two     02:00
four    04:00

如果您在纸上或白板上或其他东西上记录了这一点,那么如果您想在03:00包含项目“三”,您可以删除最后一行。但是在数据库中,您可以简单地将 insert有点用词不当) 新数据插入到表的末尾:

item    time
----    ----
one     01:00
two     02:00
four    04:00
three   03:00

数据的存储不需要是顺序的,当你展示数据时(为了可读性或者股东报告),你可以根据最适合展示的方式来排序。
如果不是编号的“项目”,你有名字:

person    time
----      ----
Betty      01:00
Annie      02:00
Charlie    03:00

这里的行是按时间“排序”的,而不是按名称的字母顺序。

SELECT name, time
FROM mytable
ORDER BY name ASC;

输出:

Annie      02:00
Betty      01:00
Charlie    03:00

如果您需要随机排序:

SELECT name, time
FROM mytable
ORDER BY RAND();

希望这些额外的信息有所帮助,因为我认为数据的 * 存储 * 和 * 表示 * 是您可能联系在一起的两个概念。
(例如,像Excel这样的电子表格在许多情况下将存储和表示结合在一起。

ttp71kqs

ttp71kqs3#

你有没有想出一个更优雅的选择?我在同一条船上,我真的很困惑,为什么这不是一个更受欢迎的主题。
虽然我认为底线是 * 除了将“用户订单”存储在自己的数据库字段中之外,没有其他选择 *。

我的列表同步流程:

1.插入列表
1.将项目添加到本地列表
1.抓取整个有序本地列表
1.插入/更新所有项目,即INSERT [...] ON EXISTING UPDATE [...]。这是可以的,因为本地行数小于或等于数据库行数。
1.重新排序
1.与上面的过程和推理相同。
1.删除列表
1.在本地删除项
1.从数据库中删除项目(this is key,因为它可以防止列表中有相同顺序的多余项目-或者,您可以删除列表中的所有项目,虽然它不太容易出错,但它看起来很愚蠢和过分)
1.(同上)抓取整个有序的本地列表
1.(同上)插入/更新所有项目,即INSERT [...] ON EXISTING UPDATE [...]。这是可以的,因为在删除之后,本地行数小于或等于数据库行数
这个过程仍然让人感觉很奇怪,尤其是当只添加、删除或修改一个项目(更改顺序)时更新整个列表的想法。
旁注:我愚蠢地遇到了一个问题,因为在一个特定的情况下,我删除了本地项,然后简单地更新了数据库中的行。起初,逻辑上是有意义的,但现实是,我们没有更新数据库中的所有行,只是那些在本地和数据库中重叠的行,留下了数据库里的另一个(我在本地删除的那个)。所以我的db表有比“order”列暗示的更多的项,因此与本地不同步。更糟糕的是,我在本地使用“user order”作为Dictionary索引,因此,当我从数据库中检索所有项目时,我用具有相同顺序的项目覆盖了项目(由于没有显式删除数据库中的项目而导致),这使得情况更加混乱。

相关问题