我有一个视图,并希望将其数据提取到一个具有create table语句和数据的文件中。 我知道mysqldump不适用于视图。
答案 0 :(得分:9)
显然,没有一种自动生成不存在的表的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
读取值并构建相应的INSERT INTO
代码。最后:
DROP TABLE my_table;
无论如何,请随意解释为什么需要从视图中获取SQL代码,我们可以找到更好的解决方案。
答案 1 :(得分:2)
使用SELECT ... INTO OUTFILE创建数据转储。
答案 2 :(得分:0)
我编写了一个bash函数来导出VIEW的“结构”和数据,而不创建数据的完整副本。我在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
}