2011-06-19 1 views
3

J'ai une base de données joomla mysql avec un préfixe de nom de table "jos_" sur tous mes noms de table. Mais je voudrais l'enlever de toutes mes tables. Je comprends comment renommer chaque table, une à la fois, mais j'ai 600 tables. Est-il facile d'exécuter une requête sql pour ce faire.Comment supprimer un nom de préfixe de chaque nom de table dans une base de données mysql

Si quelqu'un a une solution, pourriez-vous s'il vous plaît poster la requête sql exacte que je peux utiliser?

+0

J'espère qu'il n'y a pas de dépendances internes ici! – Strawberry

Répondre

11

Vous pouvez générer les instructions nécessaires avec une seule requête:

select 'RENAME TABLE ' || table_name || ' TO ' || substr(table_name, 5) ||';' 
from information_schema.tables 

Enregistrer la sortie de cette requête dans un fichier et vous avez toutes les déclarations dont vous avez besoin.

Ou si cela retourne 0 s et 1 s plutôt les statemenets, voici la version en utilisant concat à la place:

select concat('RENAME TABLE ', concat(table_name, concat(' TO ', concat(substr(table_name, 5), ';')))) 
from information_schema.tables; 
+1

Assez sûr que vous cherchiez 'concat', pas' || '(ne fonctionne pas ma copie de MySQL, de toute façon). –

+1

'||' fonctionne pour moi (mais j'exécute mon installation en mode ANSI) –

+1

J'ai ajouté la version 'concat' pour les personnes pour lesquelles' || 'renvoie' 0's et '1's. –

3

Vous pouvez créer votre propre procédure stockée pour renommer vos tables, avec que vous n'avez pas besoin d'ouvrir un tout éditeur externe se fera sur le serveur:

delimiter // 
CREATE PROCEDURE rename_tables(IN db CHAR(255), IN srch CHAR(255), IN rplc CHAR(255)) 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE from_table CHAR(255); 
    DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=db; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN cur1; 

    read_loop: LOOP 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 

    FETCH cur1 INTO from_table; 
    SET @to_table = REPLACE(from_table, srch, rplc); 

    IF from_table != @to_table THEN 
     SET @rename_query = CONCAT('RENAME TABLE ', db, '.', from_table, ' TO ', @to_table, ';'); 

     PREPARE stmt FROM @rename_query; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    END IF; 

    END LOOP; 

    CLOSE cur1; 
END// 
delimiter ; 

Utilisation:

CALL rename_tables('test', 'jos_', ''); 

Mise à jour: Ce fut ma première procédure stockée MySQL et je suis tombé sur les six années vieux bug #5967 qui était assez ennuyeux, vos noms de variables doivent être différents des noms de champs, parce que si elles ne sont pas vous » Vous obtiendrez NULL valeurs dans vos variables. Donc, soyez conscient de cela si vous décidez d'écrire une procédure stockée MySQL.

9
  1. Dans phpmyadmin sélectionnez toutes les tables de votre base de données.
  2. Dans le menu déroulant 'sélection:' choisissez 'Remplacer le préfixe de table'
  3. Set From-> pour remplacement.
  4. FAITE
+0

OMG. Cette solution est géniale. C'est comme ça que tu le fais – Fury

Questions connexes