137 votes

Réorganiser / réinitialiser la clé primaire à incrémentation automatique

J'ai une table MySQL avec une clé primaire à incrémentation automatique. J'ai supprimé quelques lignes au milieu de la table. Maintenant, j'ai, par exemple, quelque chose comme ceci dans la colonne ID : 12, 13, 14, 19, 20. J'ai supprimé les lignes 15, 16, 17 et 18.

Je veux réaffecter / réinitialiser / réorganiser la clé primaire afin d'avoir une continuité, c'est-à-dire faire du 19 un 15, du 20 un 16, et ainsi de suite.

Comment puis-je le faire ?

12voto

lbrutti Points 316

Ou bien, à partir de PhpMyAdmin, supprimez l'indicateur "AutoIncrement", enregistrez, remettez-le en place et enregistrez, ce qui le réinitialise.

0 votes

Désolé, je ne peux pas tester avec les versions actuelles de phpmyadmin. Ma réponse est assez ancienne... Si vous m'avez rétrogradé, pouvez-vous la modifier ?

5voto

Shubham Malik Points 45
SELECT * from `user` ORDER BY `user_id`; 

SET @count = 0;

UPDATE `user`  SET `user_id` = @count:= @count + 1;

ALTER TABLE `user_id` AUTO_INCREMENT = 1;

si vous voulez order by

2voto

Anjani Barnwal Points 146

dans phpmyadmin

note : cela fonctionnera si vous supprimez les dernières rangées et non les rangées du milieu.

Allez dans votre table-> cliquez sur le menu des opérations-> allez dans les options de la table->changez AUTO_INCREMENT à ce numéro à partir duquel vous voulez commencer.

l'auto-incrément de votre table commence à partir de ce non.

Essayez-le. enter image description here

1voto

Anush B M Points 39

Cela fonctionne - https://stackoverflow.com/a/5437720/10219008.....but si vous rencontrez le problème "Error Code : 1265. Données tronquées pour la colonne 'id' à la ligne 1'... Exécutez alors ce qui suit. Ajouter l'ignorance sur la requête de mise à jour.

SET @count = 0;
set sql_mode = 'STRICT_ALL_TABLES';
UPDATE IGNORE web_keyword SET id = @count := (@count+1);

0voto

willy Points 8

Vous pouvez supprimer la fonctionnalité d'auto-incrémentation de la clé primaire de cette colonne, puis, à chaque fois que vous mettez à jour cette colonne, exécuter une requête qui comptera toutes les lignes de la table, puis exécuter une boucle qui itère à travers ce nombre de lignes en insérant chaque valeur dans la ligne respective, et enfin exécuter une requête qui insère une nouvelle ligne avec la valeur de cette colonne étant le nombre total de lignes plus un. Cela fonctionnera parfaitement et c'est la solution la plus absolue pour quelqu'un qui essaie d'accomplir ce que vous faites. Voici un exemple de code que vous pouvez utiliser pour la fonction :

$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("
    SELECT `rank`, `field1`, `field2`, `field3`, `field4`
        FROM (SELECT (@rank:=@rank+1) as `rank`, `field1`, `field2`, `field3`, `field4`
            FROM (SELECT * FROM `views`) a
            CROSS JOIN (SELECT @rank:=0) b
            ORDER BY rank ASC) c
");
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
    $data[] = $row;
}
foreach ($data as $row) {
    $new_field_1 = (int)$row['rank'];
    $old_field_1 = (int)$row['field1'];
    mysql_query("UPDATE `table` SET `field_1` = $new_field_1 WHERE `field_1` = $old_field_1");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");

Ici, j'ai créé un tableau associatif auquel j'ai ajouté une colonne de rang avec la requête dans une requête select, ce qui a donné à chaque ligne une valeur de rang commençant par 1. J'ai ensuite itéré à travers le tableau associatif.

Une autre option aurait été d'obtenir le nombre de lignes, d'exécuter une requête de sélection de base, de récupérer le tableau associatif et de l'itérer de la même manière, mais en ajoutant une variable qui se met à jour à chaque itération. Cette méthode est moins souple, mais elle permet d'obtenir le même résultat.

$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("SELECT * FROM `table`");
$updated_key = 0;
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
    $data[] = $row;
}
foreach ($data as $row) {
    $updated_key = $updated_key + 1;
    mysql_query("UPDATE `table` SET `field_1` = '$updated_key' WHERE `field_1` = '$row['field_1']'");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X