我需要以插入语句的形式从数据库中获取数据进行备份
我需要在 c# 中单击按钮来完成它。所以我认为一个 sql 查询或存储过程将适合这样做,而不是 mysqldump。
其次,我需要它们用于所有表。而不是写表名和列名。它们应该从 information_schema 中获取,因为查询不需要针对不同的 scema 进行更改
如果已经存在解决方案,请指导我。
更新:我已经准备了一个解决方案,它已发布,仍在寻找更好的解决方案。
我需要以插入语句的形式从数据库中获取数据进行备份
我需要在 c# 中单击按钮来完成它。所以我认为一个 sql 查询或存储过程将适合这样做,而不是 mysqldump。
其次,我需要它们用于所有表。而不是写表名和列名。它们应该从 information_schema 中获取,因为查询不需要针对不同的 scema 进行更改
如果已经存在解决方案,请指导我。
更新:我已经准备了一个解决方案,它已发布,仍在寻找更好的解决方案。
我提出了一个复杂但可以接受的解决方案。但需要改进。
这是一个具有复杂编码的复杂过程,尤其是通过复杂连接将所有列的所有行提取到单个结果中的查询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 table_name=@tn;
1 :column_names 作为一个单独的值,由
`,` => @cs1 = id`,`ename`,`did
select group_concat(column_name separator '`,"\',\'",`') into @cns2
from information_schema.columns where table_schema=dn and table_name=@tn;
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.1concat(",@cns2,")
获取单个列中所有列的值。
5.2 在最外层 concat 现在 @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);
select concat("insert into users (id,name,password) values ('",id,"'"),
concat(",'",username,"'"),
concat(",'",password,"'),") INTO OUTFILE 'c:\\datas\\asd.txt' from users