MySQL Update Sorted Number

Ik heb MYSQL-gegevens zoals deze

id  | number
1   | 3
4   | 4
7   | 7
10  | 5
11  | 6

Ik heb de database op deze manier en hoe het -nummer bij te werken, zodat het incrementeel wordt gesorteerd?
Wat betekent dat het resultaat zo zal zijn

id  | number
1   | 1
4   | 2
7   | 3
10  | 4
11  | 5

ik heb de vraag bijgewerkt, zodat er geen verwarring is in id en omdat ID niet opeenvolgend zal zijn

1
ja, het nummer veld kan bestaande waarde (NIET UNIEK) bevatten voor gesorteerd. Het nummerveldtype is VARCHAR zonder UNIEKE SLEUTEL of een willekeurige SLEUTEL
toegevoegd de auteur GusDeCooL, de bron
Bevat het veld nummer ook unieke waarden of bestaat er tweemaal hetzelfde nummer ?
toegevoegd de auteur Zane Bien, de bron

3 antwoord

set @val = 0;
update  table_name set number = (@val:[email protected]+1);

Dit zou werken, zelfs als de tabel is:

id  | number
1   | 3
4   | 4
7   | NULL
10  | 5
11  | NULL

om zo te zijn:

id  | number
1   | 1
4   | 2
7   | 3
10  | 4
11  | 5
4
toegevoegd
Dit werk als charme, maar ik vraag me af of ik een 10.000-rij database heb en er meer aan toegevoegd zal worden. Wordt deze databasequery langer uitgevoerd?
toegevoegd de auteur GusDeCooL, de bron
Wat als er openingen zijn in nummer (d.w.z. nummer bestaat niet)?
toegevoegd de auteur Zane Bien, de bron
zoals dit? 1 | 1 4 | 2 7 | 3 10 | NULL 11 | 5
toegevoegd de auteur osyan, de bron
Het stelt de nummerkolom in op 1, 2, 3, 4 ... zelfs als sommige NULL zijn
toegevoegd de auteur osyan, de bron
je kunt ook een bestelling toevoegen om zeker te zijn! update table_name set number = (@val: = @ val + 1) volgorde op id asc;
toegevoegd de auteur osyan, de bron
@GusDeCooL Ik hoop dat ik goed begrijp wat je bedoelt! dus ik zou moeten zeggen: het zal werken, maar het is niet nodig om elke dag je primaire sleutel te hernummeren. Maar de manier om deze query sneller uit te voeren in de tweede keer dat u dit wilt doen, is om de primaire sleutel te hernummeren van het maximum van de primaire sleutel die u de vorige keer had. Ik bedoel dat u de code id == 10,000 moet hernummeren naar de laatste kolom die onlangs in uw tabel is gemaakt.
toegevoegd de auteur osyan, de bron

Probeer dit:

SET @idrank = 0;
SET @numrank = 0;

UPDATE 
    tbl a
INNER JOIN
    (
        SELECT id, @idrank:[email protected]+1 AS id_rank
        FROM tbl
        ORDER BY id
    ) b ON a.id = b.id
INNER JOIN
    (
        SELECT number, @numrank:[email protected]+1 AS number_rank
        FROM tbl
        ORDER BY number
    ) c ON b.id_rank = c.number_rank
SET
    a.number = c.number;

Dit zorgt voor hiaten en onregelmatigheden in het veld nummer en duplicaten. Stel dat de volledige gegevensset zoiets was als:

id   |   number
---------------
2    |   534
3    |   421
6    |   2038
7    |   41
10   |   5383
11   |   5
12   |   933
15   |   43

De resulterende tabel die na de update wordt ingesteld, is:

id   |   number
---------------
2    |   5
3    |   41
6    |   43
7    |   421
10   |   534
11   |   933
12   |   2038
15   |   5383

Verklaring:

Het neemt in principe de oplopende rijen van elk veld afzonderlijk en voegt zich bij elkaar in de rangorde, zodat de geordende id overeenkomt met het bijbehorende geordende nummer .

De eerste INNER JOIN subselect ziet er als volgt uit:

id   |   id_rank
---------------
2    |   1
3    |   2
6    |   3
7    |   4
10   |   5
11   |   6
12   |   7
15   |   8

Dan zal de tweede INNER JOIN subselect dit leuk vinden:

number   |   number_rank
---------------
534      |   5
421      |   4
2038     |   7
41       |   2
5383     |   8
5        |   1
933      |   6
43       |   3

Wanneer u vervolgens de twee subselecteert op id_rank = number_rank , geeft u de stijgende volgorde van de twee velden op. Als u dat eenmaal hebt, wordt bijwerken een kwestie van het instellen van het tabelnummer = het nummer van de tweede gekoppelde tafel.

0
toegevoegd
update table set number=id where 1
0
toegevoegd
nee nee, sorry. de ID is mogelijk niet gesorteerd. omdat een deel ervan zal worden verwijderd.
toegevoegd de auteur GusDeCooL, de bron
dus verander je tabelstructuur in je vraag naar de slechtste staat
toegevoegd de auteur user1432124, de bron