2011-03-03 10 views
12

Estoy comparando las tablas de bases de datos en un servidor de desarrollo con un servidor activo, buscando los cambios de nombre de columna, nuevas columnas y columnas que se han eliminado. Me gustaría hacer algo como esto:Salida de grupo de SHOW COLUMNS en lista delimitada por comas

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

lo que busco es una lista separada por comas que entonces puedo tomar para el servidor en vivo y hacer:

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

Alguna idea sobre cómo Es mejor hacer esto, ya sea corrigiéndome en mi propio enfoque, o por otro medio todos juntos? Obviamente, el SQL anterior no funciona.

Nota: Los servidores están completamente separados y es posible que no se comuniquen entre sí, por lo que no es posible realizar una comparación directa.


EDITAR

Gracias por las respuestas, chicos! La aplicación de sus respuestas a la pregunta, esta es mi SQL final para obtener los nombres de columna:

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' 

Eso me da una lista que tiene el siguiente aspecto:

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

entonces puedo utilizar esta consulta para comparar :

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') 

Los resultados son una lista de las columnas que existen en la primera base de datos y no en la segunda. ¡Perfecto!

Respuesta

16

Tome un vistazo a la tabla 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' 

edición. El esquema de información le permite realizar consultas sobre metadatos. Entonces, incluso puede comparar campos entre tablas con una combinación izquierda por ejemplo.

editar. Hola Chris. Me alegro de que hayas resuelto. Como dijiste, tu problema era bastante diferente porque se refería a diferentes servidores. Agrego un ejemplo de dos bases de datos diferentes en el mismo servidor.

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 

y el resultado obvio es dob que está presente en la tabla 1 y no en la tabla 2.

Espero que ayude a alguien más. Saludos chicos. :)

1

Debe usar INFORMATION_SCHEMA.

Puede copiar la tabla information_schema.columns de cada base de datos en un esquema compartido y luego ejecutar consultas SQL para compararlas.

+0

Gracias, Ike. Nick estuvo antes que tú, pero +1 por tu respuesta, ¡muy apreciado! –

Cuestiones relacionadas