2010-11-23 29 views
1

私は1000以上のレコードがあると仮定します。私がこれを行うと考えることができる唯一の方法は、すべての記録位置を更新することです。 MYSQL - データレコードの順番を変更する

がに、ユーザが「2」のレコードの後に​​「5」のレコードの位置を移動させたいとしましょう

など、私は、「 position」という列を持っている 1、2、3、4、5としましょうこれは私が "3"を記録するために記録 "5"を更新し、 "4"を記録するために "3"を記録し、 "5"を記録するために "4"を記録する必要がある。

これを行う別の方法はありますか?これはあなたがたくさんのレコードを持っているときには残酷に思えます。

ありがとうございます!

+0

プライマリキーとは何ですか?あなたの質問の意味はあなたのテーブル構造からもっと明らかになります。 –

+0

位置はプライマリキーではなく、私は "uid"と呼ばれるカラム名をプライマリキーとして持っています。 – dpark

答えて

0

データをソートするために使用する余分なフィールドを持たずに、NextItemの外部キーを導入してください。アイテムの元の主キーを保持することができます。主キーは引き続き識別値として機能しますが、ソート順とは関係ありません。

あなたは、このことができます:

ID: 33, Name: The first item, NextItem: 48 
ID: 48, Name: The second item, NextItem: 12 
ID: 12, Name: The last item, NextItem: NULL 

今、あなたは再順番にあなたのデータをしなければならないすべては、単一のレコードの「NextItem」を変更です。

+0

面白い考えですが、「最初の」アイテムをどのように特定していますか? 「最初の」アイテムが与えられた場合、このメソッドを使用してアイテムをどのように注文しますか?あなたの例を考えてみると、少なくともSQLクエリではそうする方法はありません。 –

+0

しかし、私はまだレコードをcertan順に配置するために各レコードを更新する必要はありませんか? – dpark

0

適切な解決策は、位置情報の使用方法とスピード要件がどのようなものかによって異なります。レコードを取得する際に(ORDER BYの位置を使用して)データベースに位置の順序付けを実行させたい場合、影響を受ける各行の位置情報を更新する必要性を避ける方法は考えられません。位置情報を、通常のテーブルPKと列 "位置"の外部キーのみを含む別のテーブルに保持することにより、過剰な行為を減らすことができます。このようにして、データベースはもっと小さなテーブルで更新を行うだけです。

関連する問題