web-dev-qa-db-fra.com

Mise à jour de la valeur AUTO_INCREMENT de toutes les tables d'une base de données MySQL

Il est possible de définir/réinitialiser la valeur AUTO_INCREMENT d’une table MySQL via

ALTER TABLE some_table AUTO_INCREMENT = 1000

Cependant, je dois définir le AUTO_INCREMENT sur sa valeur existante (pour réparer la réplication M-M), quelque chose comme:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1 qui ne fonctionne pas

En fait, j'aimerais lancer cette requête pour toutes les tables d'une base de données. Mais en réalité, ce n'est pas très crucial.

Je ne pouvais pas trouver un moyen de résoudre ce problème, à l'exception de l'exécution manuelle des requêtes. Voulez-vous s'il vous plaît suggérer quelque chose ou me faire remarquer quelques idées?.

Merci

28
pars

En utilisant:

ALTER TABLE some_table AUTO_INCREMENT = 0

... réinitialisera la valeur auto_increment pour qu'elle corresponde à la valeur la plus élevée existante dans la colonne auto_increment.

Pour exécuter cette opération sur toutes les tables, vous devez utiliser la syntaxe SQL dynamique de MySQL appelée PreparedStatements car vous ne pouvez pas fournir le nom de la table pour une instruction ALTER TABLE en tant que variable. Vous devrez boucler la sortie de:

SELECT t.table_name
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_schema = 'your_database_name'

... en exécutant l'instruction ALTER TABLE ci-dessus pour chaque table.

42
OMG Ponies
set @db = 'your_db_name';

SELECT concat('ALTER TABLE ', @db, '.', TABLE_NAME, ' AUTO_INCREMENT = 0;') 
FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db

Ensuite, copiez-collez et exécutez le résultat obtenu.

13
the_nuts

Dans les instructions ci-dessous, vous devrez remplacer tout ce qui se trouve entre [crochets] par votre valeur correcte. SAUVEZ-VOUS AVANT DE TENTER.

Si vous pouvez vous connecter à mysql en tant que root via la ligne de commande, vous pouvez procéder comme suit pour réinitialiser auto_increment sur toutes les tables. Nous allons d'abord construire nos requêtes que nous voulons exécuter:

Faites une sauvegarde de la base de données:

mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz]

S'identifier:

mysql -u root -p

Définissez group_concat_max_length sur une valeur plus élevée afin que notre liste de requêtes ne soit pas tronquée:

SET group_concat_max_len=100000;

Créez notre liste de requêtes en utilisant les éléments suivants:

SELECT GROUP_CONCAT(CONCAT("ALTER TABLE ", table_name, " AUTO_INCREMENT = 0") SEPARATOR ";") FROM information_schema.tables WHERE table_schema = "[DATABASENAME]";

Ensuite, vous recevrez une longue chaîne de requêtes mysql suivie d'un tas de tirets. Copiez la chaîne de requêtes dans votre presse-papiers, il ressemblera à ceci:

ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued...

Passez à la base de données sur laquelle vous souhaitez exécuter la commande:

USE [DATABASENAME];

Ensuite, collez la chaîne qui se trouve dans votre presse-papiers et appuyez sur Entrée pour l'exécuter. Cela devrait exécuter l’alter sur chaque table de votre base de données.

Foiré? Restauration à partir de votre sauvegarde, assurez-vous de vous déconnecter de mysql avant d'exécuter ce qui suit (tapez simplement exit; pour le faire)

gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname]

Je n'assumerai aucune responsabilité pour les dommages causés par l'utilisation de l'une de ces commandes, à utiliser à vos risques et périls.

6
nicholas.alipaz

En supposant que vous devez résoudre ce problème en modifiant la colonne d’incrémentation automatique plutôt que les clés étrangères de la table décomposant la relation N: M, et que vous pouvez déterminer les valeurs correctes, essayez d’utiliser une table temporaire contenant la colonne correspondante. pas d’auto-incrémentation, puis mappez-la à la place de la table d'origine et modifiez le type de colonne pour l'incrémentation automatique par la suite, ou tronquez la table d'origine et chargez les données à partir de la table temporaire. 

1
symcbean

J'ai trouvé ce Gist sur github et cela a fonctionné à merveille pour moi: https://Gist.github.com/abhinavlal/4571478

La commande:

mysql -Nsr -e "SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t WHERE t.table_schema = 'DB_NAME'" | xargs -I {} mysql DB_NAME -e "ALTER TABLE {} AUTO_INCREMENT = 1;"

Si votre base de données nécessite un mot de passe, vous devez malheureusement l'indiquer dans la commande pour que cela fonctionne. Un contournement (pas encore great mais fonctionne) est de mettre le mot de passe dans un fichier sécurisé. Vous pouvez toujours supprimer le fichier après afin que le mot de passe ne reste pas dans l'historique de vos commandes:

 ... | xargs -I {} mysql -u root -p`cat /path/to/pw.txt` DB_NAME -e...
1
Yes Barry

J'ai écrit ci-dessous procédure modifier le nom de la base de données et exécuter la procédure

CREATE DEFINER=`root`@`localhost` PROCEDURE `setAutoIncrement`()
BEGIN
DECLARE done int default false;
    DECLARE table_name CHAR(255);
DECLARE cur1 cursor for SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t 
        WHERE t.table_schema = "buzzer_verifone";

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    open cur1;

    myloop: loop
        fetch cur1 into table_name;
        if done then
            leave myloop;
        end if;
        set @sql = CONCAT('ALTER TABLE ',table_name, ' AUTO_INCREMENT = 1');
        prepare stmt from @sql;
        execute stmt;
        drop prepare stmt;
    end loop;

    close cur1;
END

Exécutez la procédure ci-dessus en utilisant la ligne ci-dessous

Call setAutoIncrement();
0
Lovesh Pareek