mysql - databases - Agrupe la salida de MOSTRAR COLUMNAS en una lista delimitada por comas
select schema mysql (2)
Debes utilizar 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.
Estoy comparando las tablas de la base de datos en un servidor de desarrollo con un servidor activo, buscando cambios de nombre de columna, nuevas columnas y columnas que se han eliminado. Me gustaría hacer algo como esto:
SELECT GROUP_CONCAT(Field) FROM (SHOW COLUMNS ON table_name) GROUP BY Field
Lo que busco es una lista delimitada por comas que luego puedo llevar al servidor en vivo y hacer:
SHOW COLUMNS FROM table_name WHERE NOT IN ([comma-delimited list from above query])
¿Alguna idea sobre la mejor manera de hacer esto, ya sea corrigiéndome en mi propio enfoque o por otro medio todos juntos? Obviamente, el SQL anterior no funciona.
Una 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 la respuesta chicos! Aplicando sus respuestas a la pregunta, este 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 se ve así:
''id'', ''name'', ''field1'', ''field2''
Entonces puedo usar 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!
Eche 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''
editar. El esquema de información le permite hacer consultas sobre metadatos. Por lo tanto, incluso puede comparar campos entre tablas con una combinación a la izquierda, por ejemplo.
editar. Hola Chris. Me alegra que hayas resuelto. Como usted dijo, su problema era bastante diferente porque se refería a servidores diferentes. 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. :)