我确定之前一定有人问过,但我找不到它:
我有一个不断发展的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);
答案 0 :(得分:1)
我没有使用My SQL,但是我记得,备份是开放式文本DDL语句。似乎这意味着每个备份的开头将包含所有表,然后是所有索引。?
也许这个带有一些表循环的命令会让你想要:My SQL 5.0 Reference Manual。
祝你好运!
答案 1 :(得分: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中找到所需的任何内容。我相信你可以编写代码来动态检查所有这些索引,但我不确定它是否对你来说很容易。
<强>更新强>
您也可以使用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 :(得分: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;
}
}