1

すべてが一意の ID を持つデータベースがあります。それらは昇順であり、私はしたいと思います..

update text SET name = 'hello french man' where id=1;

そして、すべての行の名前を私が持っているこのデータに変更します。だから私は増加し続けることができます

id = id + 1;

しかし、ここで問題が発生します。過去にいくつかの行を削除したため、ID が欠落しています。たとえば、行 1、2、3、5 があります。行 4 を削除したために欠落しています。行 4 を更新しても何も起こらないため、名前をスキップせずにすべての行を更新するにはどうすればよいですか?

すべての名前を 1 対 1 でマッピングし、順序が重要であるため名前を省略しないことが重要です。

ありがとう、どんな助けでも大歓迎です!

4

1 に答える 1

3

このソリューションを使用できます:

UPDATE tbl a
INNER JOIN
(
    SELECT id, @rn:=@rn+1 AS rn
    FROM tbl
    CROSS JOIN (SELECT @rn:=0) var_init
    ORDER BY id
) b ON a.id = b.id
LEFT JOIN
(
    SELECT id, @rn2:=@rn2+1 AS rn
    FROM tbl
    CROSS JOIN (SELECT @rn2:=-1) var_init
    ORDER BY id
) c ON b.rn = c.rn
SET a.id = COALESCE(c.id, a.id + 1)

SQLFiddle デモを見る

于 2012-07-26T05:07:15.263 に答える