10
votes

Comment déposer toutes les tables vides d'une base de données MySQL?

Comment déposer toutes les tables vides d'une base de données MySQL, laissant uniquement les tables qui ont au moins 1 enregistrement?

Edit: Voici ce que j'ai utilisé avec Python 3 avec MySQLClient P>

import MySQLdb

conn = MySQLdb.connect(
    host='localhost', user='root',
    passwd='mypassword', db='mydatabase'
)

c = conn.cursor()
c.execute('SHOW TABLES')
for row in c.fetchall():
    table_name = row[0]
    c.execute(f'SELECT * FROM {table_name}')
    if c.rowcount == 0:
        # c.execute(f'DROP TABLE {table_name}')
        print(f'DROP TABLE {table_name}')


0 commentaires

8 Réponses :


1
votes
  • Si "vide" signifie des entrées avec "" si (SELECT * de tableXY) Table de table Drop TableXy
  • Si "vide" signifie non pas d'entrée si (SELECT * de tableXy) Table de table Drop TableXy

    (vous devez exécuter ces requêtes pour chaque table, car je n'ai pas trouvé de moyen d'effectuer une requête sur toutes les tables d'une requête)

    C'est la même requête, mais je veux différer de rien et quelque chose sans contenu;)


0 commentaires

4
votes

Cette procédure stockée devrait le faire:

DELIMITER $$

DROP PROCEDURE IF EXISTS `drop_empty_tables_from` $$

CREATE PROCEDURE `drop_empty_tables_from`(IN schema_target VARCHAR(128))
BEGIN
    DECLARE table_list TEXT;
    DECLARE total      VARCHAR(11);

    SELECT
        GROUP_CONCAT(`TABLE_NAME`),
        COUNT(`TABLE_NAME`)
    INTO
        table_list,
        total
    FROM `information_schema`.`TABLES`
    WHERE
          `TABLE_SCHEMA` = schema_target
      AND `TABLE_ROWS`   = 0;

    IF table_list IS NOT NULL THEN
        SET @drop_tables = CONCAT("DROP TABLE ", table_list);

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

    SELECT total AS affected_tables;
END $$

DELIMITER ;


4 commentaires

Très agréable; C'est un peu plus court et plus élégant que le mien ... j'avais oublié qu'il y avait un champ de Taille_Rows.


Merci James. (Je déteste la limite de 15 caractères)


Cependant ... pour INNODB, il est garanti que TABLE_ROWS est zéro que si la table est vide? (Je pense que cela serait l'un des rares fois où le table_rws pour une table InnoDB serait correct, mais je ne sais pas réellement).


James, il semble qu'il ne soit pas garanti d'être précis, même dans ce cas.



3
votes

et une version PHP pour la complétude. Il ne laissera rien laisser tomber, il suffit d'imprimer pour vous les déclarations de chute: xxx


1 commentaires

haha im Un idiot ... regardé cela et l'a essayé et était comme pourquoi le **** ne sera pas des tables. A manqué le commentaire. Merci Man, travaillé comme un charme



1
votes

Voici une version modifiée du script PHP Publié précédemment,
J'ai ajouté une fonction qui boucle via toutes les bases de données (et comme le script d'origine, notamment MySQL_Query () lorsque vous souhaitez exécuter le script pour réel)

<?php
$username="root";
$password="mypassword";
$database="information_schema";
mysql_connect('localhost',$username,$password);
mysql_select_db($database) or die( "Unable to select database\n");

function find_databases() {
// edit the query if you want to add more databases that you dont want to mess with
$databaseq = mysql_query("SELECT DISTINCT(SCHEMA_NAME) FROM SCHEMATA WHERE SCHEMA_NAME not in ('information_schema','mysql','phpmyadmin');");
    while($databaser = mysql_fetch_array($databaseq)){
        echo "Checking $databaser[0] ...\n";
            drop_empty_tables_and_db($databaser[0]);
    }
}

function drop_empty_tables_and_db($get_database){
    mysql_select_db($get_database) or print( "Unable to select database $get_databas\n");
    $tables = mysql_query('SHOW TABLES');
    while($table = mysql_fetch_array($tables)){
        $table = $table[0];
        $records = mysql_query("SELECT * FROM $table");
        if(mysql_num_rows($records) == 0){
            echo "DROP TABLE `$table`; \n";
            //mysql_query("DROP TABLE `$table`") or print( "Unable to drop table $table\n");
        }
    }
    $tables = mysql_query('SHOW TABLES');
    if(mysql_num_rows($tables) == 0){
        echo "DROP DATABASE `$get_database`;\n";
        //mysql_query("DROP DATABASE `$get_database`") or print( "Unable to drop database $get_database\n");
    }
}

find_databases(); //...and remove them :)

?>


0 commentaires

1
votes

Si utilisé directement à partir de la coque, remplacez dB avec Nom de base de données. Notez que cela est en direct, pas de mot note.

db='wordpress_db';
for f in $(mysql -e "use $db;SHOW TABLES;" | sed 's/^| \([^ ]*\).*$/\1/g'|sed 1d);
do 
   c=`mysql -e "use $db;SELECT COUNT(*) FROM ${f}\G"|sed '/:/!d; s/^[^:]*: //g'`;
   [[ $c == 0 ]] && { echo "DROP db.$f" && mysql -e "use $db;DROP TABLE $f"; }
done


0 commentaires

5
votes

Utilisez PT-Trouver de Percona Toolkit: xxx


0 commentaires

0
votes

Une autre solution à l'aide de PHP est la suivante:

#connect to database first

$sql = "SHOW TABLE STATUS FROM `".$database."` 
WHERE ENGINE IS NOT NULL
AND `Rows`=0";
if($res = mysql_query($sql)){
    if(mysql_numrows($res)){
        while($r = mysql_fetch_assoc($res)){
            $table = $r['Name'];
            echo '<br />'.$table;
            if($ret = mysql_query("DROP TABLE `".$table."`")){
                echo ' = DROPPED';
            }else{
                echo ' = '.mysql_error();
            }
        }
    }
}


0 commentaires

0
votes

Essayez ceci: xxx

variable $ i montrer le nombre de table supprimé


0 commentaires