6

次のようなテーブルがあります。

| 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 でこれを行うにはどうすればよいですか?

4

5 に答える 5

15

自動インクリメントをリセットする最もクリーンな方法は、別のテーブルを作成することです。

MySQLには、CREATE TABLE LIKEやなどのRENAME TABLE便利なコマンドが用意されています。

CREATE TABLE table2 LIKE table1;

INSERT INTO table2
  SELECT * FROM table1 ORDER BY name;

DROP TABLE table1;

RENAME TABLE table2 TO table1;
于 2009-12-05T13:27:33.713 に答える
9

なぜあなたがこれをしたいのか尋ねてもいいですか?

誰かが名前の値のいずれかを変更したり、新しい行を挿入したりすると、順序付けスキームが台無しになります。表の他の場所(名前の列)ですでに使用可能なPKの順序に何らかの意味を格納しようとすると、冗長であるように思われるため、悪い考えになります。

はるかに優れた解決策は、ID列の値を気にせず、アプリでデータを使用するときに名前列で並べ替えることです。

PS:無回答タイプの回答でごめんなさい。通常、あなたには正当な理由があり、あなたがやろうとしていることに直接答える答えを与えると思いますが、他の質問から、あなたはまだデータベース設計についての初期の学習段階にあることに気づきました。賢明でないアプローチに向けてさらに前進するのを助けるのではなく、正しい方向にあなたを向けてください。

于 2009-12-05T00:42:27.967 に答える
7

古いテーブルから新しいテーブルにSELECT INTOして、必要に応じて選択を順序付けることができます。新しいテーブルに自動インクリメント ID があります。必要に応じて、古いテーブルを削除し、新しいテーブルの名前を変更します。

于 2009-12-05T00:40:25.230 に答える
2

クエリの最後に「ORDER BY name ASC」を追加してみませんか? なんらかの理由でIDが必要になると思います。

于 2009-12-05T00:38:17.247 に答える
-1
 SELECT
       RANK() Over (ORDER BY Name) As NewID
     , Name
     , Color

 FROM Fruits

一時テーブルに保存してから、フルーツテーブルを切り捨ててから挿入することもできますが、これはおそらくくだらない解決策です。

于 2009-12-05T00:42:43.707 に答える