存储数据库结构

时间:2011-07-12 16:08:51

标签: mysql sql database data-structures

是否有一些工具可以为我存储数据库结构,例如在某些xml文件或类似文件中。

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

我不想保持自己所有这些事情。

6 个答案:

答案 0 :(得分:1)

根据我的经验,我使用MySQL Workbench来处理这样的问题。如果从http://wb.mysql.com/下载Workbench(假设您还没有),您可以选择“从现有数据库创建EER图”。这将创建一个EER图,它是您正在使用的数据库的良好视觉呈现。然后可以加载您可以保存的.mwb文件,然后将其“转发”到本地/外部数据库中。

Mysqldump是在命令行中使用的另一种选择。默认情况下,它会转储整个架构结构并包含数据。但是,如果您只是在寻找包含视图和例程的数据库结构,并且您不关心数据本身,那么您需要在命令中添加一些额外的参数。

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

修改

您应该注意,仅仅因为您将数据库创建表查询导出到.sql文件或.mwb文件,您不能将文本复制并粘贴到另一个平台(Microsoft SQL,Oracle等)并期望它上班。不同版本的SQL的语法(显然)不同。

答案 1 :(得分:1)

以下答案使用PHP 我将此处保留给未来的用户。

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

$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>";

将结果粘贴到php文件(名为currentDB.php)中。

然后在另一个文件中,您使用您创建的文件进行创建:

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;
}

答案 2 :(得分:0)

您可以使用Mysqldump导出数据库。该网页包含有关如何使用它的所有详细信息。

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

SHOW CREATE TABLE tblname

如果您的数据库中有数据,外键,存储过程和视图,那么MySQL Workbench可以为您转发所有内容。

答案 3 :(得分:0)

对于MySQL和其他人,您可能想尝试DESCRIBE TABLE

答案 4 :(得分:0)

您可能需要查看mysqldump实用程序。它将以SQL格式创建数据库的副本。 (注意避免我遇到的问题:如果你想捕获你存储的函数和程序,一定要使用--routines运行它!)

典型的命令看起来像这样:

mysqldump --routines -Q --opt -p -u username databasename >savefile.sql

此外,对于大型数据库,这些文件可能会变得非常大。您可能还想考虑使用以下内容来解压缩它们或以其他方式压缩它们:

mysqldump --routines -Q --opt -p -u username databasename | gzip >savefile.sql.gz

答案 5 :(得分:0)

使用phpMyAdmin您可以使用导出选项

将您的结构导出到XMLSQLCSV和其他许多其他内容