2017-03-28 5 views
2

私はテーブル "ハウス" があります。テーブル内のすべてのレコードを増分値で更新するにはどうすればよいですか?

id | name | order 
1 | riw | 0 
2 | hnm | 0 
4 | vse | 0 
5 | tes | 0 

をそして、私は単純に受け取りたい:

UPDATE house SET position = position + 1 

のが、どのように私は、この値をインクリメントすることができます

id | name | order 
1 | riw | 0 
2 | hnm | 1 
4 | vse | 2 
5 | tes | 3 

は、だから私は試してみました?

+0

あなたのテーブルがどのように大きいですか? – Avi

+0

レコードがすでにテーブル内で順番に並んでおり、Orderフィールドを更新する必要があると仮定できますか?また、あなたは新しいレコードを追加する方法を尋ねていますか?もしそうなら、それはリストの始め、終わり、または中間のどこかにありますか? – toonice

答えて

5

使用id列が更新する:

UPDATE house SET order = id - 1 

あなたが1以外のn値から開始することができますidを感じた場合は、試してみてください。

SET @position:=0; 
update house 
set [email protected]:[email protected]+1 
+0

私の例ではこれは良い答えですが、私は他の例(IDが1ではなく)に必要です。 – fozeh

+0

@fozeh clearify more –

+0

たとえば、IDがデータベースのポジション(57,59,60,65)になっています。 – fozeh

-2

は、単にテーブルに移動し、順序列自動インクリメント

を作ります
+0

今後シャッフルして注文を変更する必要があるかもしれません。追加されたレコード、削除されたレコード、または上記の組み合わせ。オーダーをオートインクリメントの列にすることで、上記の痛みを和らげることができます。 – toonice

+0

データが変更された場合、ur update queryを再度実行する必要があります。 – Avi

2

オラクルでROWNUM

My SQLに:ランクを使用できます。また、自動増分されたID列を持つ一時表を作成することもできます。その後、メインテーブルから一時テーブルに挿入します。最後にメインテーブルを切り捨て、一時テーブルから挿入し直します。

また、あなたの目的のために変更することができます以下のクエリを見ることができます。

SET @row_number = 0; 

SELECT 
    (@row_number:[email protected]_number + 1) AS num, firstName, lastName 
FROM 
    employees 
LIMIT 5; 

enter image description here

+0

「ランクが使える」とはどういう意味ですか?ランクについて学ぶために私が行くことができる参照ページがありますか? – toonice

1

これは、基本的には変数を使用して、それをインクリメントし、テーブルを結合し、MS SQLではオーダー

+0

これは少なくともMySQLにとっては最高の答えです。 –

1

を更新、と一時テーブルを作成

update house as hs 
inner join 
(select id, (@row:[email protected]+1) as o from house h, (select @row:=0) as r) as hsjoin 
on hsjoin.id = hs.id 
set hs.order = hsjoin.o; 

を行うだろう関数Row_Number()を実行し、テンポラリテーブルに結合しているテーブルを更新します

現時点では

私は、構文が完全に右であるかどうかわからないが、私はより多くの理由は、私が

例を考えてきたアプローチで答えることにしました:

SELECT ROW_NUMBER() OVER(ORDER BY id asc) AS RowNr, 
     id, name 
INTO #tmp 
FROM house 

UPDATE house 
SET  h.position = t.RowNr - 1 
FROM house h 
JOIN tmp t ON h.id = t.id 
関連する問題