sql >> Base de Datos >  >> RDS >> Mysql

Consulta SQL de copia de seguridad de la base de datos

Para obtener datos de toda la base de datos:demostración de SqlFiddle

Para obtener datos de una sola tabla - - Demostración de SqlFiddle

He hecho una solución compleja pero aceptable. Pero necesita mejoras .

Este es un procedimiento complejo con una codificación compleja, especialmente la consulta que obtiene todas las filas de todas las columnas en un solo resultado por group_concat y formatos con una concatenación compleja.

Lo necesita simplificado, eficiente y que funcione en todos los escenarios.

Algunos detalles de mi solución :La siguiente es la parte importante, otra es solo condiciones/bucle (no soy hábil con la documentación, también necesita tiempo y sugerencias, alguien podría ayudarme a formatear y mejorar, disculpe las molestias, sin embargo, estaré encantado de cualquier ayuda) de ti y de mí)

Nota:group_concat(yourColumn separator ' --anySeparator-- ') fusiona todas las filas de su columna como una tal que las Filas están separadas por --anySeparator--

select group_concat(column_name separator '`,`') into @cns1 from
information_schema.columns where table_schema=dn and [email protected];

1:column_names se obtienen como un solo valor separado por

`,` => @cs1 = id`,`ename`,`did

select group_concat(column_name separator '`,"\',\'",`') into @cns2
from information_schema.columns where table_schema=dn and [email protected];

2:column_names se obtienen como un solo valor separado por

`','` => @cn2  = id`','`ename`','`did

set @cns1=concat("`",@cns1,"`");    set @cns2=concat("`",@cns2,"`");

3:La letra que falta (`) se coloca al principio y al final de los nombres de columna

set @res=concat(@res," insert into ",@tn,"(",@cns1,") values ('");

4:Simplemente hace que res= " insert into emp( `id` , `ename` , `hizo` ) values(" Aquí puede ver por qué he puesto separadores (se logra el formato MySql)

set @temp := '';
set @q := concat("select group_concat(concat(",@cns2,") separator \"'),('\")
 from ",dn,".",@tn, " into @temp");

Arriba está la declaración más crucial Obtiene todas las filas de datos de la tabla como filas de una sola columna y, además, estas filas se fusionan y se separan por '),('

5.1 concat(",@cns2,") obtiene los valores de todas las columnas en una sola.

5.2 Después de la concatenación más externa ahora @q es

 @q = "select group_concat(`id`','`ename`','`,did` separator '),(' from 
mydb.emp into @temp";

5.3:group_concat fusionará todas las filas de esa columna combinada en un solo valor. Los valores de las columnas se unirán a través de los separadores existentes en @cns2 y la unión a nivel de filas se realizará con '),('

prepare s1 from @q;
execute s1;deallocate prepare s1;
set @res = concat(@res,@temp,");");    

@q se ejecuta

set @res = concat(@res,@temp,");");

6:Y obtendremos el resultado como

 res was = insert into emp(`id`,`ename`,`did`) values ('
@temp = 1','e1','4'),('2','e2','4'),
('3','e3','2'),('4','e4','4'),('5','e5','3

Y después de @res = concat(@res,@temp,");"); obtenemos

 insert into emp(`id`,`ename`,`did`) values ('1','e1','4'),('2','e2','4'),
('3','e3','2'),('4','e4','4'),('5','e5','3);