代码之家  ›  专栏  ›  技术社区  ›  leora Matt Lacey

如何保持数据库表中记录的顺序

  •  9
  • leora Matt Lacey  · 技术社区  · 14 年前

    我正在创建一个数据库表,它将存储最终显示在网页上的菜单链接。

    例如,假设我想要链接(按此顺序):

    Home  
    About  
    Products  
    Shopping  
    

    我可以叫一张桌子 并有列: 姓名、订单

    我的数据如下:

    Name      Order  
    Home      1  
    About     2  
    Products  3  
    Shopping  4  
    

    联系方式 但我想出现在家里。

    有没有人能想出一种更好的方法来存储一个需要在数据库表中排序的列表,而不需要这种繁琐的维护工作。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Rohit Banga    11 年前

    我觉得这与使用数组与链表的一般问题有关。

    对于您的示例,选项卡不太多,因此基于数组的方法应该可以正常工作。

    ID Name      NExT  
     1 Home      2  
     2 About     3  
     3 Products  4 
     4 Shopping  NULL
    

    添加和删除行类似于插入和删除链接列表。

    修改的表

    ID Name       NExT  
     1 Home       5  
     2 About      3  
     3 Products   4 
     4 Shopping   NULL
     5 Contact us 2
    

    也可以使用prev列,使其类似于双链接列表。

        2
  •  5
  •   OMG Ponies    14 年前

    如果没有ORDER BY,则无法保证数据的顺序—通常,如果没有orderby,则它将基于插入顺序。


    使用分析/窗口化/排名函数(如ROW_NUMBER)是可以避免的,但这取决于数据和数据库支持(MySQL不支持分析函数,Oracle 9i+/PostgreSQL 8.4+/SQL Server 2005+do)。但是,如果您希望以“B”开头的条目出现在“A”之前,那么分析函数就没有帮助。

    您可以选择使用两个语句插入单个记录:

    UPDATE YOUR_TABLE
       SET sort_order = sort_order + 1
     WHERE sort_order >= 2
    
    INSERT INTO YOUR_TABLE
      (value, sort_order)
    VALUES('new value', 2)
    

    或删除现有记录,并以新顺序重新插入列表。

        3
  •  3
  •   Salar    9 年前

    您应该考虑,当您使用链接列表时,当您要重新排序其中一个项目时,您还必须更新其他记录,这需要在一个根本不快的事务中完成。(您需要事务,因为所有更新都必须完全完成,或者都不必更新)
    这个问题还有一个解决办法 小的
    要使用此方法,请为每个记录指定一个数字。例如:

    Name    Number
    Home     5
    About    10
    Products 15
    shopping 20
    

    数字较小的行位于列表的开头,数字最大的行将是列表的最后一项 产品 你所要做的就是更改 产品 数字
    关于 数字是10,所以 产品

    Name    Number
    Home     5
    About    10
    Products 7.5
    shopping 20
    

    现在您可以根据 数字 领域