2011-07-12 70 views
0

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

后来又从它可以生成对我来说这个数据库创建SQL查询的代码?
目前我正在使用MySQL,但它可能没有关系。

只是我不想保持我自己所有这些东西。

+0

我忘了问你是否使用php。因为如果你不是我会删除我的答案 – Neal

+0

@Neal,对不起,我没有使用它:( –

+0

我想我会保留答案在这里为未来的用户 – Neal

回答

1

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

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

以我的经验mysqldump的是快速和容易,而EER图是从Workbench应用程序更容易与他人共享,然后正向工程返回到其他数据块。

编辑

你应该注意到,仅仅因为你导出数据库中创建表查询到.sql文件或.mwb文件,你不能只是复制和粘贴文本到另一个平台(微软SQL ,甲骨文等),并期望它的工作。跨越不同版本的SQL的语法(显然)是不同的。

+0

我用那里的建模工具和设计架构后,如何将其应用于实际数据库? –

+0

打开EER模型,点击顶部的“数据库”,然后点击“正向工程师”。系统会提示您输入连接信息,然后建立数据库 – MoarCodePlz

0

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

如果你想在SQL创建表,你可以使用:

SHOW CREATE TABLE tblname 

如果你在你的数据库中的数据,外键,存储过程和视图然后MySQL Workbench可以正反都为你。

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

非常令人印象深刻,但缺乏自动类型转换和其他由php-> mysql提供的难题,为什么你要创建一个php脚本来完成其他工具(MySQL Workbench,Mysqldump)已经做得更好?知道是什么促使你创建这个 – MoarCodePlz

+0

@MoarCodePlz。我们这样做是为了让我们能够运行第一个脚本并为我们的客户端提供一个新的'currentDB.php'文件他们所要做的就是把它放在适当的位置并运行更新脚本(代码的第二部分) – Neal

+0

@MoarCodePlz - 此代码还更新所有索引等。 – Neal

0

你可能要考虑的mysqldump效用。它将以SQL格式创建数据库的副本。(请注意,以避免我遇到了一个问题:要确保,如果你也想捕捉你的存储功能和程序,--routines运行它)

一个典型的命令应该是这个样子:

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

另外,对于大型数据库,这些文件可能会变得很大。您可能还需要考虑使用gzip压缩他们或以其他方式在飞行压缩它们使用类似:

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

使用phpMyAdminü可以将结构导出到XMLSQLCSV和其他许多使用导出选项