MYSQL:如何“重新排序”一个表

hfwmuf9z  于 2023-01-20  发布在  Mysql
关注(0)|答案(6)|浏览(183)

我有一个如下所示的表,

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

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

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

问题:我怎样才能用MYSQL做到这一点呢?

owfi6suc

owfi6suc1#

重置自动增量的最简单方法是创建另一个表。
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;
2hh7jdfx

2hh7jdfx2#

我能问问你为什么要这么做吗?
如果任何人修改了name值或插入了新行,那么将打乱您的排序方案。试图在表中其他地方(name列)已经可用的PK排序中存储一些含义似乎是多余的,因此是个坏主意。
一个更好的解决方案是,当您在应用中使用数据时,不必担心ID列的值,只需对名称列进行排序。

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

svujldwt

svujldwt3#

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

af7jpaap

af7jpaap4#

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

arknldoa

arknldoa5#

如果您有一个带有自动增量主键(例如名为'id')的表,并且其他表不依赖于该键,则处理方法如下。
1.完全删除列ID。

  1. alter table order by column_x, column_y;
    1.使用自动增量再次添加主键列“id”。
    我用phpmyadmin做过几次,很快就成功了。对一个有主键作为索引的表重新排序是不可能的。这就是为什么你需要先删除它。
    如果你需要保留“id”列,但是需要根据其他列重新排序,你需要忽略id列的主键和索引状态并重新排序。然后你需要添加一个新列作为主键/索引。
llycmphe

llycmphe6#

SELECT
       RANK() Over (ORDER BY Name) As NewID
     , Name
     , Color

 FROM Fruits

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

相关问题