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}')
8 Réponses :
si (SELECT * de tableXY) Table de table Drop TableXy code> Li>
- Si "vide" signifie non pas d'entrée
si (SELECT * de tableXy) Table de table Drop TableXy code> Li>
ul>
(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) p>
C'est la même requête, mais je veux différer de rien et quelque chose sans contenu;) p>
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 ;
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 code> est zéro que si la table est vide? (Je pense que cela serait l'un des rares fois où le table_rws code> 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.
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:
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
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 :)
?>
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
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();
}
}
}
}
Essayez ceci: variable $ i montrer le nombre de table supprimé p> p> p>