2011-07-12 327 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和其他許多使用導出選項