Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Datenbank-Backup-SQL-Abfrage

Um Daten der gesamten Datenbank zu erhalten - SqlFiddle Demo

Um Daten von nur einer Tabelle zu erhalten - - SqlFiddle Demo

Ich habe eine komplexe, aber akzeptable Lösung gefunden. Muss aber verbessert werden .

Dies ist eine komplexe Prozedur mit komplexer Codierung, insbesondere die Abfrage, die alle Zeilen aller Spalten in einem einzigen Ergebnis durch group_concat abruft und Formate mit einer komplexen Verkettung.

Benötigen Sie es vereinfacht, effizient und in allen Szenarien funktionsfähig.

Einige Details meiner Lösung :Das Folgende ist der wichtige Teil, der andere sind nur Bedingungen/Looping (Ich bin nicht geschickt mit Dokumentation, außerdem braucht es Zeit und Vorschläge, jemand könnte mir bei der Formatierung und Verbesserung helfen, Entschuldigung für etwaige Unannehmlichkeiten, aber ich werde mich über jede Hilfe freuen von dir und mir)

Hinweis:group_concat(yourColumn separator ' --anySeparator-- ') führt alle Zeilen Ihrer Spalte zu einer zusammen, sodass die Zeilen durch --anySeparator--

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

1 :Spaltennamen werden als einzelner Wert, getrennt durch

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

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

2 :Spaltennamen werden als einzelner Wert, getrennt durch

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

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

3:Fehlender Buchstabe (`) wird am Anfang und am Ende der Spaltennamen eingefügt

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

4:Lässt einfach res= " insert into emp( einfügen `id` , `ename` , `did` ) values(" Hier können Sie sehen, warum ich Trennzeichen eingefügt habe (MySql-Formatierung wird erreicht)

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

Oben ist die wichtigste Aussage Es erhält alle Datenzeilen aus der Tabelle als Zeilen einer einzelnen Spalte und weiter werden diese Zeilen zusammengeführt, indem sie durch '),(' getrennt werden

5.1 concat(",@cns2,") erhält Werte aller Spalten in einer einzigen.

5.2 Nach dem äußersten Concat steht nun @q

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

5.3 :group_concat führt alle Zeilen dieser kombinierten Spalte zu einem Wert zusammen. Spaltenwerte werden durch Trennzeichen verbunden, die in @cns2 vorhanden sind, und die Verbindung auf Zeilenebene erfolgt mit '),('

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

@q wird ausgeführt

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

6 :Und wir erhalten das Ergebnis als

 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

Und nach @res = concat(@res,@temp,");"); wir bekommen

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