2009-07-22 10 views
1

J'ai une colonne nommée "nom" qui est présente dans toutes les tables de la base de données mysql.sélection de la première colonne de toutes les tables dans une base de données mysql

Je voulais énumérer tous les noms dans toutes les tables si je l'ai utilisé la requête suivante

select name from (SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE') as abc 

Mais cela n'a pas fonctionné pour moi et il me place retourné la colonne nom_table seul.

J'ai ensuite utilisé les tables d'exposition et la sortie stockés dans une autre table appelée liste_tables puis i exécuté la requête suivante

select name from (select table_name from table_list) as abc 

Cela m'a retourné le même résultat à savoir tous les noms de table. Puis-je savoir ce que je fais de mal et quelle est la bonne façon de le faire? J'utilise MySQL 5.4 et je veux écrire une sous-requête ou une procédure ou une fonction purement mysql.

Répondre

1

Ce dont vous avez besoin est un moyen d'avoir des variables en SQL (vous pouvez donc dire select * from $name where $name in (select ...)). SQL ne le permet pas.

Ma suggestion est de diviser le processus en place:

Première exécution de cette requête:

select 'select distinct name from ' || table_name || ' union' 
from select table_name from table_list 

Cela vous donnera Selects à courir. Mettez-les dans un petit script, supprimez la dernière "union" et exécutez ce script.

[EDIT] Si MySQL prend en charge un opérateur "eval" dans les procédures stockées (c'est-à-dire où vous pouvez générer du SQL à partir de pièces puis l'exécuter), vous pouvez le faire. J'ai vérifié les docs et il ne semble pas qu'il y ait un eval. Vous pouvez également écrire une extension en C (voir chapter 22) qui implémente la recherche ou une fonction "eval".

Mais je suppose que votre base de données ne changera pas tout le temps. Donc la solution la plus simple serait d'écrire un petit script SQL qui crée le code pour une vue (c'est une chaîne, elle ne crée pas réellement la vue). Chaque fois que la base de données change, il suffit d'exécuter le script pour recréer la vue et ensuite, vous pouvez exécuter la requête sur la vue pour obtenir une liste de tous les noms.

2

Il est PREPARE et EXECUTE qui peut exécuter une instruction SQL à l'intérieur d'une variable utilisateur, donc pourrait probablement utiliser quelque chose de similaire à (non testé!)

SET @a = "";

SELECT @a := CONCAT('(select name from ',GROUP_CONCAT(table_name SEPARATOR ') UNION (select name from '),')') FROM information_schema.tables WHERE table_type='BASE TABLE' GROUP BY 1;

PREPARE stmt FROM @a;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

Questions connexes