将数据导入MySQL数据库的最佳方法,该数据库使用连接导出到单个XML文件

时间:2013-09-28 11:15:07

标签: mysql xml import export

我正在尝试使用MySQL和XML编写导出/导入工具。数据通常由一个注册用户导出,并由另一个用户导入数据库。

数据存在于不同的表中,并与导出查询的SQL“where”子句中指定的id相关联。

我可以通过运行带有连接的SQL查询将数据导出到单个文件中。

允许其他用户从导出文件导入数据的“最新”方法是什么?

我的问题是文件中的记录包含仅在某些表中使用的字段,并且在引用未插入数据的表中使用的字段时导致SQL查询失败。

我可以通过编写指定要插入的字段的查询来解决这个问题,但如果在应用程序开发期间忽略了对导入查询的这些维护更新,则会产生大量的维护开销和漏洞。

这是一个“最佳实践”问题。

更新

我最终做了什么来克服与链接表相关的问题以及自动递增主要ID的提取和插入是完整地导出行。换句话说,所有字段(包括主要ID)都添加到导出文件中。然后,当重新导入数据时,为了正确地添加链接表中的行,我的代码保存了来自不同表的所有旧ID,然后插入没有这些旧ID的行。这涉及使用旧的ID来正确链接来自不同表的数据。新ID由自动增量生成。这有点牵扯,但至少没有处理非id字段。当在应用程序开发期间添加新数据字段时,这将使代码更加健壮并且能够抵抗破坏。

我的代码如下所示。请注意,$ file将使用对话框创建。

    if($option=='Export test'){
        // ----
        // Exports an xml file. This includes all primary ids
        // ----
        $file='export.xml';
        $xml='<?xml version="1.0" encoding="ISO-8859-1" ?>'."\n";
        $xml.="<".$database_connect.">\n";
        file_put_contents($file,$xml);
        $rows=returnTestQuestionsPlus($template_id);
        $table='test_questions';
        exportRowsToXMLFile($table,$rows,$file);
        foreach($rows as $row){
            $question_id=$row['question_id'];
            $rows2=returnTestAnswersPlus($question_id);
            $table='test_answers';
            exportRowsToXMLFile($table,$rows2,$file);
        }
        $xml="</".$database_connect.">";
        file_put_contents($file,$xml,FILE_APPEND);
        header("Location: select_template.php?info_message=The $object6 has been exported to $file.");
        exit;
    }
    if($option=='Import test'){
        // ----
        // Gets xml file content. This includes all primary ids.
        // ----
        $file='export.xml';
        $xml=file_get_contents($file);
        $xml=str_ireplace(chr(10),'',$xml);
        $xml=str_ireplace(chr(13),'',$xml);
        $xml=new SimpleXMLElement($xml);
        $tables = json_decode(json_encode((array)$xml), TRUE);
        // ----
        // Removes primary ids and then inserts data into the database.
        // ----
        foreach($tables as $table=>$rows){
            foreach($rows as $row){
                if($table=='test_questions'){
                    $old_question_ids[]=$row['question_id'];
                }
            }
        }
        foreach($tables as $table=>$rows){
            foreach($rows as $row){
                if($table=='test_questions'){
                    $question_id=$row['question_id'];
                    unset($row['question_id']);
                    unset($row['sort_id']);
                    unset($row['template_id']);
                    $sql="select count(*) as number from test_questions";
                    $row2=returnRow(__LINE__,$sql);
                    extract($row2);
                    $sort_id=$number+1;
                    $row['sort_id']=$sort_id;
                    $row['template_id']=$template_id;
                    $results=insertRow2('test_questions',$row);
                    extract($results);
                    $new_question_ids[]=$id;
                }
            }
        }
        $test_answers_rows=array();
        foreach($tables as $table=>$rows){
            foreach($rows as $row){
                if($table=='test_answers'){
                    $question_id=$row['question_id'];
                    foreach($old_question_ids as $key=>$old_question_id){
                        if($question_id==$old_question_id)$new_question_id=$new_question_ids[$key];
                    }
                    unset($row['question_id']);
                    unset($row['answer_id']);
                    $row['question_id']=$new_question_id;
                    $test_answers_rows[]=$row;
                }
            }
        }
        insertMultipleRowsPDP('test_answers',$test_answers_rows);
        header("Location: select_template.php?info_message=The $object6 has been imported from $file.");
        exit;
    }

0 个答案:

没有答案