将MySQL视图转储为带数据的表

12

假设我在数据库中有一个视图,我想向某人发送一个文件,以便他们可以将该视图的输出作为表格创建到他们的数据库中。

当然,mysqldump仅导出“create view…”语句(好吧,它包括create table,但不包括数据)。

我的做法是将该视图简单地复制为真实表格并进行转储。但对于大型表格,这很慢且浪费资源:

create table tmptable select * from myview

除了创建一个模仿mysqldump行为并执行此操作的脚本之外,是否有更好的方法?


该视图包含一个空间列,在使用CSV文件进行导入时我遇到了问题。 :( - barryhunter
1
终于把这个事情圆满解决了,我终于整理并发布了我创建的脚本来解决这个问题。https://github.com/barryhunter/fakedump - 它就像建议的那样,只需运行像“select * from view”这样的查询,并将其实际写入mysqldump格式。 - barryhunter
3个回答

4

1
如果您没有访问mysql服务器shell的权限,这将无法工作。还有其他解决方案吗? - Artem Russakovskii

3

好的,根据您提到的CSV失败评论,请参考Paul的回答。对其进行以下更改:

 - FIELDS TERMINATED BY ','
 + FIELDS TERMINATED BY ',' ESCAPED BY '\'

完成上述步骤后,导入时需要使用"load data infile"命令,并使用与之前相同的终止符/封闭符/转义符。


1
只是想指出,如果您使用 \ ,则需要转义转义字符,就像这样 FIELDS TERMINATED BY ',' ESCAPED BY '\\' - Alix Axel

1
我也遇到了同样的问题,我的问题是我想将视图定义(84个字段和数百万条记录)导出为“创建表”语句,因为视图可能随时间变化而变化,我需要自动化处理。所以这就是我做的:
  1. 从视图中创建一个没有记录的表

mysql -uxxxx -pxxxxxx my_db -e "create table if not exists my_view_def as select * from my_view limit 0;"

  1. 导出新表定义。我添加了一个sed命令来更改表名my_view_def以匹配原始视图名称(“my_view”)

mysqldump -uxxxx -pxxxxxx my_db my_view_def | sed s/my_view_def/my_view/g > /tmp/my_view.sql

  1. 删除临时表

mysql -uxxxx -pxxxxxx my_db -e "drop table my_view_def;"

  1. 将数据导出为CSV文件

SELECT * from my_view into outfile "/tmp/my_view.csv" fields terminated BY ";" ENCLOSED BY '"' LINES TERMINATED BY '\n';

然后你会得到两个文件,一个是定义文件,另一个是CSV格式的数据文件。


几乎与我最终创建的fakedump脚本相同。唯一的区别是,使用了一个真正的临时表(仍然带有LIMIT 0)-这样可以使用与视图相同的名称创建临时表!但除此之外,它运行得非常好。 - barryhunter
哇,超级棒的升级!而且不需要删除已创建的表格,因为它是临时的。我会尝试的。 - Gonzalo Cao
不确定这是否对您有帮助,需要安排“创建临时表...”、“显示创建表”和“选择...到outfile...”在同一个实际连接中发生。但可能有效。 - barryhunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接