代码之家  ›  专栏  ›  技术社区  ›  Leo

MySQL导出索引

  •  0
  • Leo  · 技术社区  · 14 年前

    我有一个正在不断开发的CMS。我已经建立了一些网站使用CMS,所以他们是一个存在的数据库数量。

    我想从开发数据库中提取索引,并将它们应用到生产数据库中。有没有一种简单的方法可以将索引提取为SQL?

    大致如下:

    create index idx1 on one (lft, rght);
    create index idx1 on two (alias);
    create index acos_idx3 on three (model, related_id);
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   ceteras    14 年前

    您可以从信息模式数据库中提取索引,然后将它们添加到另一个数据库中,但这并不容易。

    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;
    

    你基本上可以在信息模式中找到你需要的任何东西。我相信您可以编写代码来动态检查所有这些索引,但我不确定这对您来说是否容易。

    更新:

    你也可以使用 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;
    
        2
  •  1
  •   Jeff Maass PrateekSaluja    14 年前

    我很少使用SQL,但我记得,备份是开放文本DDL语句。似乎这意味着每个备份的开头都将包含所有表,然后是所有索引。?

    My SQL 5.0 Reference Manual .

    祝你好运!

        3
  •  0
  •   Leo    14 年前

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

    }