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