【问题标题】:MYSQL: how to "reorder" a tableMYSQL:如何“重新排序”表
【发布时间】:2010-12-23 11:07:17
【问题描述】:

我有一张如下表,

| id  | name   | color  |
------+--------+---------
| 1   | pear   | green  |
| 2   | apple  | red    |
| 3   | banana | yellow |
| 4   | grape  | purple |

我想使用“名称”列按字母顺序重新排序,并用这个新顺序重置 id(自动增量)以得到以下结果

| id  | name   | color  |
------+--------+---------
| 1   | apple  | red    |
| 2   | banana | yellow |
| 3   | grape  | purple |
| 4   | pear   | green  |

问题:如何使用 MYSQL 做到这一点?

【问题讨论】:

  • 为什么要id顺序匹配name顺序?

标签: mysql alphabetical


【解决方案1】:

重置自动增量最简洁的方法是创建另一个表。

MySQL 提供了有用的命令,例如 CREATE TABLE LIKERENAME TABLE

CREATE TABLE table2 LIKE table1;

INSERT INTO table2
  SELECT * FROM table1 ORDER BY name;

DROP TABLE table1;

RENAME TABLE table2 TO table1;

【讨论】:

  • 错了。您不能选择全部 (SELECT * FROM table1 ),因为如果这样做,您将复制 PK 以及与行信息具有相同的关联。这将为您留下相同的表,其名称和颜色相同,但链接到相同的 ID,但顺序不同。
  • 一个更正,您需要先从表 2 中删除 PK,然后再从表 1 插入;然后不要选择 * ,但选择除 ID 之外的所有列。它会像魅力一样发挥作用
【解决方案2】:

我能问一下你为什么要这样做吗?

如果有人修改任何名称值或插入新行,它会弄乱您的排序方案。试图在表中其他地方(名称列)中已经可用的 PK 的顺序中存储一些含义似乎是多余的,因此是个坏主意。

一个更好的解决方案是当您在应用程序中使用数据时,不必担心 ID 列的值,而只需对名称列进行排序。

PS:很抱歉没有回答类型的回复。通常我会假设你有一个很好的理由,只是给出一个直接解决你正在尝试做的事情的答案,但我从你的其他问题中注意到你仍处于数据库设计的早期学习阶段,所以我想提供帮助为您指明正确的方向,而不是帮助您进一步朝着不明智的方法前进。

【讨论】:

  • 这是一个很好的观点。如果您需要一些与每个字符串的排序值相对应的唯一数字,您可以添加一个额外的列并根据需要进行更新。如果 ID 被用作另一个表中的外键,那么重新排序 ID 会很糟糕。
  • 我建议添加一个额外的列进行排序的唯一情况是当排序不能由表中的其他列确定时。例如,如果应用程序允许用户任意重新排序项目。
  • 记录形成一个集合。这些集合不应该按特定顺序排序。回想一下,关系数据库理论是基于纯数学概念的。如果你想在你的应用程序中指定一个特定的顺序,添加一个 orderby 子句,否则执行计划将决定如何检索数据,从而决定顺序;这些计划会随着时间而改变。此外,请记住代理键对最终用户毫无意义。
  • 如果您添加一个额外的列或只保留 id 列,请确保为这些列添加相应的索引,否则在表变得太大后将无法有效地搜索它。
【解决方案3】:

您可以SELECT INTO 从旧表中创建一个新表,并根据需要将您的选择排序。在新表中有一个自增 ID。如果需要,删除旧表并重命名新表。

【讨论】:

    【解决方案4】:

    为什么不在查询末尾添加“ORDER BY name ASC”?我的猜测是您出于某种原因需要该 ID。

    【讨论】:

      【解决方案5】:
       SELECT
             RANK() Over (ORDER BY Name) As NewID
           , Name
           , Color
      
       FROM Fruits
      

      可以保存到临时表然后截断然后截断水果表并插入,但这可能是一个糟糕的解决方案。

      【讨论】:

      • MySQL 不支持窗口函数。
      • 这个很接近了,但是现在如何将NewID保存到id呢?
      猜你喜欢
      • 2013-09-19
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2011-01-11
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多