在mysql中从视图转储数据

在mysql中从视图转储数据,mysql,mysqldump,Mysql,Mysqldump,我有一个视图,希望将其数据提取到一个包含CREATETABLE语句和数据的文件中。 我知道mysqldump在视图上不起作用。用于创建数据转储。显然,对于不存在的表,没有自动生成create TABLE语句的方法。所以你基本上有两个选择: 创建一个实际的表,转储它,然后删除它 编写大量代码来分析视图和基础表,并生成适当的SQL 第一个选项根本不是最优的,但很容易实现: CREATE TABLE my_table AS SELECT * FROM my_view 现在可以使用mysqldump转

我有一个视图,希望将其数据提取到一个包含CREATETABLE语句和数据的文件中。
我知道mysqldump在视图上不起作用。

用于创建数据转储。

显然,对于不存在的表,没有自动生成
create TABLE
语句的方法。所以你基本上有两个选择:

  • 创建一个实际的表,转储它,然后删除它
  • 编写大量代码来分析视图和基础表,并生成适当的SQL
  • 第一个选项根本不是最优的,但很容易实现:

    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̶-不要-它只输出一行,这是一件非常特别的事情。。。更多关于“选择到”的特殊文档:要加载数据,您需要
    加载数据填充…
    文档: