Mysql
 sql >> база данни >  >> RDS >> Mysql

Резервно копие на база данни SQL заявка

За да получите данни за цялата база данни - 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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL заявка за получаване на имена на колони?

  2. myisam да постави заключване на таблицата на масата дори когато работи със заявка за 'select'?

  3. Използване на Java за установяване на сигурна връзка с MySQL Amazon RDS (SSL/TLS)

  4. Нишка беше окачена на java.net.SocketInputStream.socketRead0(Native Method), някой знае ли какво се случи?

  5. Извеждане на Excel файл в PHP след ехо