【问题标题】:Re-ordering numeric columns重新排序数字列
【发布时间】:2012-05-02 16:10:04
【问题描述】:

我正在将 PHP/MySQL 用于 Web 应用程序。用户可以为不同的工作输入行项目。订单项的顺序很重要。为此,我有一个“订单号”字段。插入新行很容易;我只是在当前最高订单号上加一。但是对于删除和插入行,它变得很棘手。现在,我使用查询在每次删除后更新所有订单号。但是,有时在同一个请求中可能会有很多删除。我在想有一个更简单的方法。例如,如果表中的订单号是

1, 2, 5, 8, 9, 10

我可以运行更新查询来更新它们吗

1, 2, 3, 4, 5, 6

【问题讨论】:

  • 这听起来像一个链表。
  • 为什么需要在删除后重新排序? ORDER BY ordernumber 将继续处理缺失的数字。
  • 您可以将订单号与行一起存储,而不是在逗号分隔的列表中吗?
  • Marcus - 它作为字段存储在记录中。抱歉,只是写了逗号列表来描述问题。
  • Ivan - 是的,我知道它仍然适用于删除,但我需要插入的完整性。

标签: mysql


【解决方案1】:

删除一行时:

update mytable
set ordernumber = ordernumber-1
where ordernumber > {number deleted}

是否有多个删除无关紧要,因为这是相对更新。

【讨论】:

  • 谢谢,我会试一试
【解决方案2】:

要更新整个序列: (这在 SQL Server 中有效——也许你可以将它用于 MySQL!)

while exists (
    select *
    from mytable mt1
    where not exists (
        select *
        from mytable mt2
        where mt2.ordernumber = mt1.ordernumber - 1
        )
    and mt1.ordernumber > 1
    )
begin
    update mytable
    set ordernumber = (
        select isnull( max( mt3.ordernumber ), 0) + 1
        from dbo.mytable mt3
        where mt3.ordernumber < mytable.ordernumber
    )
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多