web-dev-qa-db-ja.com

シーケンス番号mysqlで列を更新する

列のあるテーブルがあります:(これは50Kレコードの例にすぎません)

Name,   Number

Joe     Null
Michael Null
Moses   Null

1から3のシーケンス番号で番号を更新して、次のようにします。

Name,   Number

Joe     1
Michael 2
Moses   3

1つのSQLコマンドでMysqlのSQLでそれを行うにはどうすればよいですか

33
Dejell
SET @rank:=0;
update T
set Number=@rank:=@rank+1;

[〜#〜] update [〜#〜]

1つのステートメントを使用する代替方法

UPDATE T
JOIN (SELECT @rank := 0) r
SET Number=@rank:=@rank+1;
101
triclosan

私はオンラインで答えを見つけるのに苦労し、上記の情報のいくつかに基づいて次の方法が私のために働いたことを見つけましたが、異なる更新アプローチを使用しました。他の人にも役立つ場合はここに投稿してください。

注:データセットの場合、ランクは1回限りの固定計算であり、変更されません。 MySQLからPythonにデータをプルするたびに計算を実行する手間を省くために、列として追加したかったのです。

私が使用したソリューション:

  • ランクを0に設定(上記のように)
  • ランクを計算するための選択クエリを含む一時テーブルを作成します
  • 計算されたランクで元のテーブルを更新します。

使用されるサンプル名、rowidは各行の一意の識別子、valueは各行のランクを決定するために使用されるメトリック

SET @rank=0;
CREATE TEMPORARY TABLE rank_temp
AS
(SELECT rowid, value, @rank:=@rank+1 AS rank FROM source_table ORDER BY value ASC);

UPDATE sourcetable a, rank_temp b
SET a.rank = b.rank
WHERE a.rowid = b.rowid;

それは粗雑な方法ですが、私のデータセットで機能しました。

2
Joining Dots

NumberをAUTO_INCREMENTに設定して、番号が生成されるようにすることができます。

ALTER TABLE your_table MODIFY Number INT AUTO_INCREMENT

それ以外には、おそらく以下が必要です:a)ストアドルーチンb)アプリケーションコード

2
Nicolae Albu