Mysql 存储数据库结构

Mysql 存储数据库结构,mysql,sql,database,data-structures,Mysql,Sql,Database,Data Structures,有没有什么工具可以为我存储数据库结构,比如说xml文件之类的 然后从代码中为我生成用于创建数据库的sql查询? 目前我正在使用MySQL,但这可能并不重要 只是我不想维护我自己所有这些东西。你可以用导出数据库。网页上有关于如何使用它的所有细节 如果希望SQL创建表,可以使用: SHOW CREATE TABLE tblname 如果您的数据库中有数据、外键、存储过程和视图,则可以为您反向转发所有这些内容。对于MySQL和其他数据库,您可能需要尝试。根据我的经验,我使用MySQL Workben

有没有什么工具可以为我存储数据库结构,比如说xml文件之类的

然后从代码中为我生成用于创建数据库的sql查询?
目前我正在使用MySQL,但这可能并不重要


只是我不想维护我自己所有这些东西。

你可以用导出数据库。网页上有关于如何使用它的所有细节

如果希望SQL创建表,可以使用:

SHOW CREATE TABLE tblname

如果您的数据库中有数据、外键、存储过程和视图,则可以为您反向转发所有这些内容。

对于MySQL和其他数据库,您可能需要尝试。

根据我的经验,我使用MySQL Workbench来处理类似的问题。如果您从下载Workbench(假设您还没有),您将可以选择“从现有数据库创建EER图”。这将创建一个EER图,它是您正在使用的数据库的良好可视化表示。然后可以加载可以保存的.mwb文件,然后将其“正向工程”到本地/外部数据库中

Mysqldump是在命令行中使用的另一种替代方法。默认情况下,它将转储整个模式结构和包含的数据。但是,如果您只是寻找数据库结构,包括视图和例程,而不关心数据本身,则需要在命令中添加一些额外的参数

根据我的经验,Mysqldump是快速而简单的,而EER图更容易与其他人共享,然后从工作台应用程序将工程师转发回其他数据库

编辑


您应该注意,仅仅因为将数据库create table查询导出为.sql文件或.mwb文件,就不能将文本复制并粘贴到另一个平台(Microsoft sql、Oracle等)中,并期望它能够工作。不同版本的SQL语法(显然)是不同的。

下面的答案使用PHP,我将它保留在这里供未来用户使用

我专门为此编写了代码(在PHP中):


“; 如果($checkTables){ echo“以下表格不在数据库中:
”。 //“”;打印($checkTables);回显“
”; ""; createTables($checkTables); $query=“在$dbname中显示表”; $tables=array(); $result=mysql\u query($query)或die(“错误一:”.mysql\u ERROR()); while($row=mysql\u fetch\u数组($result)){ $tables[]=$row[“tables_in_$dbname”]; } } //要获取用于表显示的数组,请执行以下操作: $cols=array(); foreach(表为$tbl){ //回声“
”。 $query=“显示来自$tbl的列”; $cols[$tbl]=array(); $result=mysql\u query($query)或die(“错误一:”.mysql\u ERROR()); while($row=mysql\u fetch\u数组($result)){ $cols[$tbl][]=数组('Field'=>$row['Field'], 'Type'=>$row['Type'], 'Null'=>$row['Null'], 'Default'=>$row['Default'], “额外”=>$row[“额外”], ); } } $checkTables=checkCols($cols); 如果($checkTables){ echo“以下列在数据库中不同:
”。 //“”;打印($checkTables);回显“
”。 ""; 可更改($检查表); } $index=array(); $query=“从信息\u schema.statistics中选择* 其中,表_SCHEMA='$dbname'; "; $result=mysql\u query($query)或die(“错误一:”.mysql\u ERROR()); while($row=mysql\u fetch\u数组($result)){ $index[$row['TABLE\u NAME'][]=array('index\u NAME'=>$row['index\u NAME'], '列名称'=>$row['列名称'], “索引类型”=>$row[“索引类型”], 'INDEX_NAME'=>$row['INDEX_NAME'], 'SEQ_IN_INDEX'=>$row['SEQ_IN_INDEX'], ); } $checkTables=检查索引($index); 如果($checkTables){ echo“以下索引在数据库中不同:
”。 //“”;打印($checkTables);回显“
”。 ""; 可更改($检查表,由工业部); } //echo“”;print_r($index);echo“
”; 函数检查表($array){ $tbls=$GLOBALS['allTables']; $diff=array_diff($tbls,$array); 如果($diff){ 返回$diff; } 返回数组(); } 函数checkCols($array){ $cols=$GLOBALS['columns']; $diff=array\u diff\u no\u cast($cols,$array); 如果($diff){ //回声“HI
”; 返回$diff; } 返回数组(); } 函数检查索引($array){ $ind=$GLOBALS['index']; $diff=数组_diff _no _cast($ind,$array); 如果($diff){ //回声“HI
”; 返回$diff; } 返回数组(); } 函数createTables($tables){ $cols=$GLOBALS['columns']; $ind=$GLOBALS['index']; foreach($t表格){ $thisCols=(isset($cols[$t])?$cols[$t]:数组(); $thisInd=(isset($ind[$t])?fromIndex($ind[$t]):array(); $create=“创建表”$t`(\n”; foreach($k=>c){ //回显“$k\n{$c['Default']}”; 如果($c['Default']='CURRENT_TIMESTAMP'){ //呼应“在这里”; $c['Extra']=“更新当前时间戳时”; } $create.=“{$c['Field']}{$c['Type']}”。 (($c['Null']='NO')?'notnull':''。“”。 ((strlen($c['Default'])>0)?“Default”。 (是否引用($c['Default'])?“{$c['Default']}'”:“{$c['Default']}”):”。 “{$c['Extra']}”; 如果(计数($thisCols)!=($k+1)){ $create.=“,\n”; } 其他的 $create.=“\n”; } $i=0; foreach($k=>c){ 如果($i==0){ $create.=“,\n”; } 如果($c['INDEX_NAME']=='PRIMARY'){ $create.=“主”; } 否则{ $iName=爆炸(
$db = mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error());
mysql_select_db($dbname) or die("MySQL Error: " . mysql_error());

$allTables = Array
    (
      //put all table names in this array
    );
foreach($allTables as $tbl){
    define($tbl, $tbl);
}
$clm = '$columns';
$inds = '$indexes';
$query = "SHOW TABLES IN {$dbname}";
$tables = array();
$result = mysql_query($query) or die("ERROR ONE:".mysql_error());
while($row = mysql_fetch_array($result)){
    $tables[] = $row["Tables_in_{$dbname}"];
}

//TO GET ARRAY FOR TABLE DISPLAY:
$cols = array();
foreach($tables as $tbl){
//    echo "<br/>".
    $query = "SHOW COLUMNS FROM $tbl";
    $cols[$tbl] = array();
    $result = mysql_query($query) or die("ERROR ONE:".mysql_error());
    while($row = mysql_fetch_array($result)){
        $cols[$tbl][] = array('Field'=>$row['Field'],
                              'Type'=>$row['Type'],
                              'Null'=>$row['Null'],
                              'Default'=>$row['Default'],
                              'Extra'=>$row['Extra'],
                        );
    }
}
$index = array();
$query = "SELECT * FROM information_schema.statistics
WHERE TABLE_SCHEMA = '{$dbname}';
"; 
$result = mysql_query($query) or die("ERROR ONE:".mysql_error());
while($row = mysql_fetch_array($result)){

    $index[$row['TABLE_NAME']][] = array('INDEX_NAME'=>$row['INDEX_NAME'],
                          'COLUMN_NAME'=>$row['COLUMN_NAME'],
                          'INDEX_TYPE'=>$row['INDEX_TYPE'],
                          'INDEX_NAME'=>$row['INDEX_NAME'],
                          'SEQ_IN_INDEX'=>$row['SEQ_IN_INDEX'],
                    );
}
//echo "<pre>";print_r($index);
//exit;
//TO GET THE ARRAY VARIABLE
echo "<pre>
&lt;?php
$clm = Array (";
foreach ($cols as $key=>$tbl){
echo "
    $key => Array (";
    foreach($tbl as $col){
        echo "
        Array ( ";
        foreach($col as $k=>$val){
            echo "
            '$k' => \"$val\",";
        }
        echo "
        ),";
    }
    echo "
    ),";
}
echo "
);";
echo "</pre>";
echo "<pre>
$inds = Array (";
foreach ($index as $key=>$tbl){
echo "
    $key => Array (";
    foreach($tbl as $col){
        echo "
        Array ( ";
        foreach($col as $k=>$val){
            echo "
            '$k' => \"$val\",";
        }
        echo "
        ),";
    }
    echo "
    ),";
}
echo "
);
?>";
echo "</pre>";
define('BY_COL', 'column');
define('BY_IND', 'index');
$allTables = Array
    (
      //put all table names in this array
    );
foreach($allTables as $tbl){
    define($tbl, $tbl);
}

include_once 'currentDB.php';
$query = "SHOW TABLES IN $dbname";
$tables = array();
$result = mysql_query($query) or die("ERROR ONE:".mysql_error());
while($row = mysql_fetch_array($result)){
    $tables[] = $row["Tables_in_$dbname"];
}

$checkTables = checkTables($tables);
echo "THE FOLLOWING TABLES <b>ARE</b> IN THE DB: <br />
    <pre>";print_r(array_diff($allTables,$checkTables));echo "</pre><br />";
if($checkTables){
    echo "THE FOLLOWING TABLES <b>ARE NOT</b> IN THE DB: <br />".
//    "<pre>";print_r($checkTables);echo "</pre><br />";
    "";
    createTables($checkTables);
    $query = "SHOW TABLES IN $dbname";
    $tables = array();
    $result = mysql_query($query) or die("ERROR ONE:".mysql_error());
    while($row = mysql_fetch_array($result)){
    $tables[] = $row["Tables_in_$dbname"];
}

}

//TO GET ARRAY FOR TABLE DISPLAY:
$cols = array();
foreach($tables as $tbl){
//    echo "<br/>".
    $query = "SHOW COLUMNS FROM $tbl";
    $cols[$tbl] = array();
    $result = mysql_query($query) or die("ERROR ONE:".mysql_error());
    while($row = mysql_fetch_array($result)){
        $cols[$tbl][] = array('Field'=>$row['Field'],
                              'Type'=>$row['Type'],
                              'Null'=>$row['Null'],
                              'Default'=>$row['Default'],
                              'Extra'=>$row['Extra'],
                        );
    }
}
$checkTables = checkCols($cols);

if($checkTables){
    echo "THE FOLLOWING COLS <b>ARE DIFFERENT</b> IN THE DB: <br />".
//    "<pre>";print_r($checkTables);echo "</pre><br />".
    "";
    alterTable($checkTables);
}
$index = array();
$query = "SELECT * FROM information_schema.statistics
WHERE TABLE_SCHEMA = '$dbname';
";
$result = mysql_query($query) or die("ERROR ONE:".mysql_error());
while($row = mysql_fetch_array($result)){
    $index[$row['TABLE_NAME']][] = array('INDEX_NAME'=>$row['INDEX_NAME'],
                          'COLUMN_NAME'=>$row['COLUMN_NAME'],
                          'INDEX_TYPE'=>$row['INDEX_TYPE'],
                          'INDEX_NAME'=>$row['INDEX_NAME'],
                          'SEQ_IN_INDEX'=>$row['SEQ_IN_INDEX'],
                    );
}
$checkTables = checkIndexes($index);

if($checkTables){
    echo "THE FOLLOWING INDEXES <b>ARE DIFFERENT</b> IN THE DB: <br />".
//    "<pre>";print_r($checkTables);echo "</pre><br />".
      "";
    alterTable($checkTables,BY_IND);
}
//echo "<pre>";print_r($indexes);echo "</pre><br />";

function  checkTables($array){
    $tbls = $GLOBALS['allTables'];
    $diff = array_diff($tbls,$array);
    if($diff){
        return $diff;
    }
    return array();
}

function  checkCols($array){
    $cols = $GLOBALS['columns'];
    $diff = array_diff_no_cast($cols,$array);
    if($diff){
//        echo "HI<br />";
        return $diff;
    }
    return array();
}

function checkIndexes($array){
    $ind = $GLOBALS['indexes'];
    $diff = array_diff_no_cast($ind,$array);
    if($diff){
//        echo "HI<br />";
        return $diff;
    }
    return array();
}

function createTables($tables){
    $cols = $GLOBALS['columns'];
    $ind = $GLOBALS['indexes'];

    foreach($tables as $t){
        $thisCols = (isset($cols[$t])?$cols[$t]:array());

        $thisInd = (isset($ind[$t])?fromIndex($ind[$t]):array());

        $create = "CREATE TABLE `$t` (\n";
        foreach($thisCols as $k=>$c){
//            echo "<pre>$k\n{$c['Default']}</pre>";
            if($c['Default']=='CURRENT_TIMESTAMP'){
//                echo "IN HERE";
                $c['Extra'] = " ON UPDATE CURRENT_TIMESTAMP";
            }
            $create .= "`{$c['Field']}` {$c['Type']} ".
                    (($c['Null']=='NO')?'NOT NULL':'')." ".
                    ((strlen($c['Default'])>0)?"DEFAULT ".
                    (is_quoted($c['Default'])?"'{$c['Default']}'":"{$c['Default']}"):'').
                    "{$c['Extra']}";
            if(count($thisCols)!==($k+1)){
                $create .= ",\n";
            }
            else
                $create .= "\n";
        }
        $i = 0;
        foreach($thisInd as $k=>$c){
            if($i == 0){
                $create .= ",\n";
            }
            if($c['INDEX_NAME']=='PRIMARY'){
                $create .= "PRIMARY ";
            }
            else{
                $iName = explode("_",$c['INDEX_NAME']);
                if(array_search("UNIQUE",$iName)){
                    $create .= "UNIQUE ";
                }
            }
            $create .= "KEY ".
                (($c['INDEX_NAME']=='PRIMARY')?'':"`{$c['INDEX_NAME']}`")." ({$c['COLUMN_NAME']})";
            if(count($thisInd)!==($i+1)){
                $create .= ",\n";
            }
            else
                $create .= "\n";
//            echo "<pre>";print_r($c);echo "</pre>";
            $i++;
        }
        $create .= ");";
//        echo "<pre>$create</pre>";
        mysql_query($create) or die("ERROR CREATE:".mysql_error());
        echo "CREATED $t<br />";
    }
//    die;
}


function fromIndex($ind){
    $return = array();
    foreach($ind as $i){
        $return[$i['INDEX_NAME']]['INDEX_NAME'] = $i['INDEX_NAME'];
//        echo $i['COLUMN_NAME']." -- <br/>".
        $return[$i['INDEX_NAME']]['COLUMN_NAME'] = (isset($return[$i['INDEX_NAME']]['COLUMN_NAME'])?"{$return[$i['INDEX_NAME']]['COLUMN_NAME']}, `{$i['COLUMN_NAME']}`":"`{$i['COLUMN_NAME']}`");
    }
//    echo "<pre>";print_r($return);echo "</pre>";
//    die;
    return $return;
}
function alterTable($table, $type = BY_COL){
//    echo "<u>";

    switch ($type){
        case BY_COL:
//            echo BY_COL;
            $tbls = $GLOBALS['cols'];
            $realTbls = $GLOBALS['columns'];
//            echo "<pre>";print_r($table);echo"</pre>";
//            die;
            foreach($table as $k=>$t){
//                echo
//                $query = "SHOW COLUMNS FROM $k";
//                echo "<br />";
                foreach($t as $ky=>$col){
//                    echo
                    if($ky == 0){
                        $after = 'FIRST';
                    }
                    else {
                        $after = "AFTER `{$realTbls[$k][$ky-1]['Field']}`";
                    }
                    $primary = false;
                    if($col['Default']=='CURRENT_TIMETAMP'){
                        $col['Extra'] .= " ON UPDATE CURRENT_TIMESTAMP";
                    }
                    if($col['Extra'] == 'auto_increment'){
                        $query2 = "ALTER TABLE  `$k` ADD PRIMARY KEY (  `{$col['Field']}` )";
                        $query3 = "ALTER TABLE `$k` CHANGE COLUMN `{$col['Field']}`
                             `{$col['Field']}` {$col['Type']} ".($col['Null']=='YES'?'NULL':'NOT NULL').
                            ((!empty($col['Default']))? ' DEFAULT '.(is_quoted($col['Default'])?"'{$col['Default']}'":$col['Default']):'').
                            " {$col['Extra']}".
                            " $after;";
                        $primary = true;
                        $col['Extra'] = "";
                    }
//                    echo
                    $query = "ALTER TABLE `$k` ".(field_in_array($tbls[$k],$col['Field'])?"CHANGE COLUMN `{$col['Field']}`":"ADD COLUMN").
                            " `{$col['Field']}` {$col['Type']} ".($col['Null']=='YES'?'NULL':'NOT NULL').
                            ((!empty($col['Default']))? ' DEFAULT '.(is_quoted($col['Default'])?"'{$col['Default']}'":$col['Default']):'').
                            " {$col['Extra']}".
                            " $after;";
//                    echo "<br/>";
                    mysql_query($query) or die("ERROR CREATE: $query".mysql_error());
                    if($primary){
                        mysql_query($query2) or die("ERROR CREATE: $query2".mysql_error());
                        mysql_query($query3) or die("ERROR CREATE: $query3".mysql_error());
                    }
                    echo "ADDED $k: {$col['Field']}";
                    echo "<br />";
                }
//                if($k == 'sessions'){
//                    echo "<pre>$ky:\n";print_r($tbls[$k]);die;
//                }
            }
            break;
        case BY_IND:
//            echo BY_IND;
            $tbls = $GLOBALS['index'];
            foreach($table as $k=>$t){
                $addTbls= fromIndex($table[$k]);
                $thisInd = (isset($tbls[$k])?fromIndex($tbls[$k]):array());
//                echo "<pre>$k:\n";print_r($addTbls);
                foreach($addTbls as $added){
                    $beg = "INDEX";
                    if($added['INDEX_NAME']=='PRIMARY'){
                        $beg = "PRIMARY KEY";
                        $added['INDEX_NAME'] = '';
                    }
                    else{
                        $iName = explode("_",$added['INDEX_NAME']);
                        if(array_search("UNIQUE",$iName)){
                            $beg = "UNIQUE ".$beg;
                        }
                    }
//                    echo
                    $query = "ALTER TABLE `$k` ".(field_in_array($thisInd,$added['INDEX_NAME'],'INDEX_NAME')?"DROP INDEX `{$added['INDEX_NAME']}`, ":'')."ADD $beg `{$added['INDEX_NAME']}` ({$added['COLUMN_NAME']})";
                    mysql_query($query) or die("ERROR CREATE:".mysql_error());
                    echo "ADDED $k: {$added['INDEX_NAME']}";
                    echo "<br />";
                }
            }
//            die;
            break;
    }
//    echo "</u><br />";

}

function is_quoted($str){
    if(is_numeric($str))
        return false;
    if($str == 'CURRENT_TIMESTAMP')
        return false;
    return true;
}

function field_in_array($arr, $field, $type = 'Field'){
    foreach($arr as $val){
//        echo "HERE: $field, $type";
//        print_r($val);echo "<br/>";
        if($val[$type]==$field){
//            echo "HI";
            return true;
        }
    }
    return false;
}

   ##################################
   #    FUNCTION - multidim diff    #
   ##################################

function array_diff_no_cast(&$ar1, &$ar2) {
   $diff = Array();
   foreach ($ar1 as $key => $val1) {
       foreach($val1 as $k=>$val2){
          if (!isset($ar2[$key]) || array_search($val2, $ar2[$key]) === false) {
             $diff[$key][$k] = $val2;
          }
       }
   }
   return $diff;
}
mysqldump --routines -Q --opt -p -u username databasename >savefile.sql
mysqldump --routines -Q --opt -p -u username databasename | gzip >savefile.sql.gz