2011-08-16 8 views
6

私はphpとmysqlを使用しています。私はid列がプライマリキーとして自動インクリメントに設定されたテーブルを持っています。 sort_orderという別の列を追加しようとしています。行が挿入されると、sort_order列は自動的にインクリメントされます。その後、ユーザーはsort_order値を変更することができます。しかし、mysqlは複数の列に対して自動インクリメントを許可していませんか?mysqlの複数の自動インクリメント

sort_order値を自動インクリメントする最も良い方法は何ですか?

人気のあるリクエストで、いくつかの説明があります。

管理領域には、カテゴリのリストがあります。 javascriptを使用すると、ユーザーはカテゴリが必要な順番をドラッグできます。スクリプトは、新しいオーダーのすべてのIDのリストと、古いオーダーのsort_order値を送信します。

次に、mysqlを新しいsort_order値で更新するphp関数があります。

私は手動ですべてのsort_order値を記入したことを除いて、これはすべて既に行われています。ユーザーが新しいカテゴリを作成したときに値を持つことができるようにしたい。

次に、sort_orderを使用して、フロントエンドでカテゴリの順序を正しく表示できます。

私はすでにすべてを済ませています。しかし、私は手動でsort_orderの値を埋め込んでいました。

+0

あなたは 'sort_order'カラムをどのように使用するかについて少し教えてください。 –

+2

正確に2番目のauto_incrementカラムが必要ですか?私はこれの背後にある推論を理解していない。 – pkk

+0

使い方について詳しく知りたい方は、より良い代替案を提案することができます。 – ThinkCode

答えて

1

、トリガーを使用することができます。

ただし、実際に自動インクリメントのsort_order値を作成する必要があるかどうかを検討する必要があります。表示コードでは、明示的な並べ替え順序が与えられた項目を並べ替え、残りの並べ替えられていない項目をリストの適切な場所(下部?)に配置できます。

7

のソートの列は、デフォルトでNULLに等しくすることができます。必要なのは少しスマートなクエリだけです。例:

select * 
from something 
order by ifnull(sort, id) 
0

sort_orderに0を格納し、次にsort_order + idでソートすることができます。 sort_orderは、正確な0の代わりに、(idにあまり)idとなりますので、結果は同じになります

1

たぶん、実際にあなたのデータモデルに意味を追加した、タイムスタンプを追加し、その上で並べ替えます。 「sort_order」列は、データ・モデルにプレゼンテーション(ビュー)ロジックを組み込むことを意味します。これは悪いことです。

+0

実際の使用状況によって異なりますが、ソート順は実際にはデータモデルの一部です。ギャラリーを考えてみましょう。はい、ソート順はプレゼンテーションに関連していますが、プレゼンテーションの順番はギャラリー全体にとっては任意かつ重要なので、モデルの一部です。これらの値は静的であるため、プライマリキーまたはタイムスタンプは使用できません。そのような状況では、ソートキーは完璧な意味を持ちます。 – pzuraq

関連する問題