2011-03-03 4 views
12

Je compare des tables de base de données sur un serveur de développement à un serveur en direct, en recherchant les changements de nom de colonne, les nouvelles colonnes et les colonnes qui ont été supprimées. Je voudrais faire quelque chose comme ceci:Sortie du groupe SHOW COLUMNS dans une liste délimitée par des virgules

SELECT GROUP_CONCAT(Field) FROM (SHOW COLUMNS ON table_name) GROUP BY Field 

Ce que je suis après une liste délimitée par des virgules que je peux alors prendre au serveur en direct et faire:

SHOW COLUMNS FROM table_name WHERE NOT IN ([comma-delimited list from above query]) 

Toute réflexion sur la façon préférable de le faire - soit en me corrigeant dans ma propre approche, ou par un autre moyen tous ensemble? Évidemment, le SQL ci-dessus ne fonctionne pas. Remarque: Les serveurs sont entièrement séparés et ne peuvent pas communiquer entre eux. Aucune comparaison directe n'est donc possible.


EDIT

Merci pour les réponses, les gars! L'application de vos réponses à la question, ceci est mon SQL finale pour obtenir les noms de colonnes:

SELECT CONCAT("'", GROUP_CONCAT(column_name ORDER BY ordinal_position SEPARATOR "', '"), "'") AS columns 
FROM information_schema.columns 
WHERE table_schema = 'db_name' AND table_name = 'tbl_name' 

Cela me donne une liste qui ressemble à ceci:

'id', 'name', 'field1', 'field2' 

Ensuite, je peux utiliser cette requête pour comparer :

SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) 
FROM information_schema.columns 
WHERE table_schema = 'db_name' AND table_name = 'tbl_name' AND column_name NOT IN ('id', 'name', 'field1', 'field2') 

Les résultats sont une liste des colonnes qui existent dans la première base de données et pas dans la seconde. Parfait!

Répondre

16

Jetez un oeil à la table INFORMATION_SCHEMA.COLUMNS

select group_concat(column_name order by ordinal_position) 
from information_schema.columns 
where table_schema = 'database_name' and table_name = 'table_name' 

d'édition. Le schéma d'informations vous permet d'effectuer des requêtes sur les métadonnées. Ainsi, vous pouvez même comparer des champs entre des tables avec une jointure gauche par exemple.

modifier. Salut chris. Content que tu aies résolu. Comme vous l'avez dit, votre problème était très différent car il concernait différents serveurs. J'ajoute un exemple de deux bases de données différentes sur le même serveur.

create database db1; 
use db1; 
create table table1(
id int not null auto_increment primary key, 
name varchar(50), 
surname varchar(50), 
dob date) 
engine = myisam; 

create database db2; 
create table db2.table2 like db1.table1; 
alter table db2.table2 drop column dob; 

select i1.column_name from (
select column_name 
from information_schema.columns 
where table_schema = 'db1' and table_name = 'table1') as i1 
left join (
select column_name 
from information_schema.columns 
where table_schema = 'db2' and table_name = 'table2') as i2 
on i1.column_name = i2.column_name 
where i2.column_name is null 

et le résultat évident est dob ​​qui est présent dans la table1 et non dans la table2.

Espérons que cela aide quelqu'un d'autre. Cordialement les gars. :)

1

Vous devez utiliser INFORMATION_SCHEMA.

Vous pouvez copier la table information_schema.columns de chaque base de données dans un schéma partagé, puis exécuter des requêtes SQL pour les comparer.

+0

Merci, Ike. Nick était avant vous, mais +1 pour votre réponse, très apprécié! –

Questions connexes