За да получите данни за цялата база данни - SqlFiddle Demo
За да получите данни само от една таблица - - SqlFiddle Демо
Направих сложно, но приемливо решение. Но има нужда от подобрение .
Това е сложна процедура със сложно кодиране, особено заявката, която извлича всички редове от всички колони в един резултат чрез group_concat
и формати със сложна конкатенация.
Нуждаете се от опростен, ефективен и работещ във всички сценарии.
Някои подробности за моето решение :Следва важната част, другото е само условия/зацикляне (не съм удобен с документацията, също има нужда от време и предложения, някой може да ми помогне при форматирането и подобрението, Извинете за неудобството, но ще се радвам на всякаква помощ от теб и мен)
Забележка:group_concat(yourColumn separator ' --anySeparator-- ') обединява всички редове на вашата колона като един, така че редовете са разделени от --anySeparator--
select group_concat(column_name separator '`,`') into @cns1 from
information_schema.columns where table_schema=dn and [email protected];
1 :column_names се получават като една стойност, разделена с
`,` => @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 се получават като една стойност, разделена с
`','` => @cn2 = id`','`ename`','`did
set @cns1=concat("`",@cns1,"`"); set @cns2=concat("`",@cns2,"`");
3:Липсваща буква (`) се поставя в началото и в края на имената на колони
set @res=concat(@res," insert into ",@tn,"(",@cns1,") values ('");
4:Просто прави res= " insert into emp(
`id` ,
`ename` ,
`did` ) values("
Тук можете да видите защо поставих разделители (постигнато е форматиране на MySql)
set @temp := '';
set @q := concat("select group_concat(concat(",@cns2,") separator \"'),('\")
from ",dn,".",@tn, " into @temp");
По-горе е най-важното твърдение Той получава всички редове с данни от таблицата като редове от една колона и освен това тези редове се обединяват, като се разделят с '),('
5.1 concat(",@cns2,")
получава стойности на всички колони в една.
5.2 След външния най-конкат сега @q е
@q = "select group_concat(`id`','`ename`','`,did` separator '),(' from
mydb.emp into @temp";
5.3 :group_concat ще обедини всички редове от тази комбинирана колона в една стойност. Стойностите на колоните ще бъдат обединени чрез разделители, съществуващи в @cns2, а свързването на ниво редове ще бъде с '),('
prepare s1 from @q;
execute s1;deallocate prepare s1;
set @res = concat(@res,@temp,");");
@q се изпълнява
set @res = concat(@res,@temp,");");
6:И ще получим резултат като
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
И след @res = concat(@res,@temp,");");
получаваме
insert into emp(`id`,`ename`,`did`) values ('1','e1','4'),('2','e2','4'),
('3','e3','2'),('4','e4','4'),('5','e5','3);