2010-06-29 27 views
0

我敢肯定它之前一定被問過,但我找不到它:MySQL出口指數

我有一個不斷髮展的CMS。我已經建立了許多使用CMS的網站,因此它們是現有的一些數據庫。

我想從開發數據庫提取索引並將它們應用到生產dbs。有沒有簡單的方法來提取索引作爲SQL?

東西線沿線的:

create index idx1 on one (lft, rght); 
create index idx1 on two (alias); 
create index acos_idx3 on three (model, related_id); 
+0

你確定這是你想要做什麼?索引通常是隨着數據的添加而即時創建的。它們與表格中的數據緊密相關,所以即使您可以這樣做,我也看不到將索引從一個數據庫複製到另一個數據庫會有什麼用處。 – Mike 2010-06-29 12:47:14

+0

這不是關於提取索引數據,而是索引定義。 例如,我猜,'mysqldump --no-data'會導出所有的語句,包括索引語句。 我在我的電腦上安裝了PowerDesigner,所以我有其他方法來檢索索引。 – pascal 2010-06-29 12:57:01

+0

@Mike:查看已編輯的問題以顯示示例輸出。 – Leo 2010-06-29 13:01:01

回答

1

您可以從INFORMATION_SCHEMA數據庫中提取索引,然後將它們添加到另一個數據庫中,但這並不容易。

給你舉一個例子(代碼用於部署的存儲過程),如果它不是已經存在,這增加了獨特的鍵:

if not exists (select * from information_schema.KEY_COLUMN_USAGE 
       where table_schema = 'database_name' 
       and table_name='your_table' 
       and constraint_name ='key_name') 
then 
    alter table your_table add unique key `key_name` ('column_name'); 
end if; 

你基本上可以找到任何你需要的INFORMATION_SCHEMA。我相信你可以編寫代碼來動態檢查所有這些索引,但我不確定它對你來說是否容易。

UPDATE:

您還可以使用show index from database.table,你可以在通過MaasSql的回答中提供的鏈接查看。然後循環搜索結果並添加每個索引,如果它不在數據庫中。

或者你可以試試這個:

if not exists (select * from information_schema.STATISTICS 
where table_schema = 'database_name' 
and table_name='table_name' 
and index_name ='key_name') 
then 
... 
end if; 
+0

這是我正在尋找的東西,但奇怪的不是所有的指標都列出來! – Leo 2010-06-29 13:49:56

+0

我又看了一遍,我已經更新了我的答案。 – ceteras 2010-06-29 15:48:23

1

我不跟我的SQL工作一大堆,但我記得,備份是開放的文本DDL語句。似乎這意味着每個備份的開始將包含所有表,然後是所有索引。

也許這個命令有點循環會讓你想要你想要的:My SQL 5.0 Reference Manual

好運氣!

+0

很好找,我不知道「show index from」。 – ceteras 2010-06-29 15:49:25

0

好吧,我不得不談點別的,這是因爲據我得到了(之前Ceteras發表了他的更新!)。目前的問題是CREATE INDEX IF NOT EXISTS是無效的,所以我需要找到另一種方法來做到這一點。在本週結束時可能會回來。

$query="SHOW TABLES"; 
$result = mysql_query($query); 
while($row = mysql_fetch_array($result)) 
{ 
    $idxQ = "SHOW INDEXES FROM {$row[0]} IN $database;"; 
    $idxR = mysql_query($idxQ); 

    while($idxRow = mysql_fetch_object($idxR)) 
    { 
     //basic query: CREATE INDEX indexName ON tableName (columnName); 
     $indexName = $idxRow->Key_name; 
     if($indexName=='PRIMARY') continue; 
     $tableName = $idxRow->Table; 
     $columnName = $idxRow->Column_name; 
     $idxCreateQ = "CREATE INDEX IF NOT EXISTS $indexName ON $tableName ($columnName);"; 
     echo $idxCreateQ; 
    } 

}