在mysql中从视图转储数据
我有一个视图,希望将其数据提取到一个包含CREATETABLE语句和数据的文件中。在mysql中从视图转储数据,mysql,mysqldump,Mysql,Mysqldump,我有一个视图,希望将其数据提取到一个包含CREATETABLE语句和数据的文件中。 我知道mysqldump在视图上不起作用。用于创建数据转储。显然,对于不存在的表,没有自动生成create TABLE语句的方法。所以你基本上有两个选择: 创建一个实际的表,转储它,然后删除它 编写大量代码来分析视图和基础表,并生成适当的SQL 第一个选项根本不是最优的,但很容易实现: CREATE TABLE my_table AS SELECT * FROM my_view 现在可以使用mysqldump转
我知道mysqldump在视图上不起作用。用于创建数据转储。显然,对于不存在的表,没有自动生成
create TABLE
语句的方法。所以你基本上有两个选择:
CREATE TABLE my_table AS
SELECT *
FROM my_view
现在可以使用mysqldump
转储表。完成后:
DROP TABLE my_table
第二个选项可以根据您的需要进行优化,但它可能会变得非常复杂,这在很大程度上取决于您的实际需要和工具可用性。但是,如果性能是一个问题,您可以将这两种方法结合在一起,以快速而肮脏的方式:
CREATE TABLE my_table AS
SELECT *
FROM my_view
LIMIT 1;
SHOW CREATE TABLE my_table;
现在,您可以使用自己喜欢的语言从my_view
读取值,并将相应的插入到
代码中。最后:
DROP TABLE my_table;
在任何情况下,请随意解释为什么需要从视图中获取SQL代码,我们可能会找到更好的解决方案。我编写了一个bash函数来导出视图的“结构”和数据,而无需创建数据的完整副本。我在CentOS 7服务器上用MySQL 5.6进行了测试。它正确地考虑了带有JSON值的列和“O'Mally”之类的字符串,尽管对于其他特殊情况,您可能需要进一步调整它 为了简洁起见,我没有使它在错误检查或其他方面具有健壮性
function export_data_from_view
{
local DB_HOST=$1
local SCHEMA=$2
local VIEW=$3
local TMP_TABLE_NAME="view_as_table_$RANDOM"
local SQL1="
create table $TMP_TABLE_NAME as
(select * from $VIEW where 1=0);
show create table $TMP_TABLE_NAME \G
"
# Create an empty table with the structure of all columns in the VIEW.
# Display the structure. Delete lines not needed.
local STRUCT=$(
mysql -h $DB_HOST -BANnq -e "$SQL1" $SCHEMA |
egrep -v "\*\*\*.* row \*\*\*|^${TMP_TABLE_NAME}$" |
sed "s/$TMP_TABLE_NAME/$VIEW/"
)
echo
echo "$STRUCT;"
echo
local SQL2="
select concat( 'quote( ', column_name, ' ),' )
from information_schema.columns
where table_schema = '$SCHEMA'
and table_name = '$VIEW'
order by ORDINAL_POSITION
"
local COL_LIST=$(mysql -h $DB_HOST -BANnq -e "$SQL2")
# Remove the last comma from COL_LIST.
local COL_LIST=${COL_LIST%,}
local SQL3="select $COL_LIST from $VIEW"
local INSERT_STR="insert into $VIEW values "
# Fix quoting issues to produce executeable INSERT statements.
# \x27 is the single quote.
# \x5C is the back slash.
mysql -h $DB_HOST -BANnq -e "$SQL3" $SCHEMA |
sed '
s/\t/,/g; # Change each TAB to a comma.
s/\x5C\x5C\x27/\x5C\x27/g; # Change each back-back-single-quote to a back-single-quote.
s/\x27NULL\x27/NULL/g; # Remove quotes from around real NULL values.
s/\x27\x27{/\x27{/g; # Remove extra quotes from the beginning of a JSON value.
s/}\x27\x27/}\x27/g; # Remove extra quotes from the end of a JSON value.
' |
awk -v insert="$INSERT_STR" '{print insert "( " $0 " );"}'
local SQL4="drop table if exists $TMP_TABLE_NAME"
mysql -h $DB_HOST -BANnq -e "$SQL4" $SCHEMA
echo
}
你可以使用̶̶D̶U̶M̶P̶F̶̶I̶̶L̶E̶-不要-它只输出一行,这是一件非常特别的事情。。。更多关于“选择到”的特殊文档:要加载数据,您需要
加载数据填充…
文档: