Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 重命名包含带有触发器的表的数据库_Mysql_Database_Table Rename - Fatal编程技术网

Mysql 重命名包含带有触发器的表的数据库

Mysql 重命名包含带有触发器的表的数据库,mysql,database,table-rename,Mysql,Database,Table Rename,我需要重命名我的数据库,通过创建新的DB并将表重命名为新的DB名称,可以重命名DB 我按照链接的部分使用InnoDB重命名表 但是我的许多表在创建触发器之前都有。在执行以下命令期间,这将在错误的架构中引发错误触发器: $mysql-u dbUsername-p“dbPassword”目录-sNe“show tables”|读取表格时;执行mysql-u dbUsername-p“dbPassword”-sNe“重命名表目录.$TABLE到库.$TABLE”;完成 MySql文档中甚至提到了这个问

我需要重命名我的数据库,通过创建新的DB并将表重命名为新的DB名称,可以重命名DB

我按照链接的
部分使用InnoDB重命名表

但是我的许多表在创建触发器之前都有。在执行以下命令期间,这将在错误的架构中引发错误
触发器:

$mysql-u dbUsername-p“dbPassword”目录-sNe“show tables”|读取表格时;执行mysql-u dbUsername-p“dbPassword”-sNe“重命名表目录.$TABLE到库.$TABLE”;完成

MySql文档中甚至提到了这个问题-


如何重命名这些表?

您可以将数据库复制到新数据库,然后将其删除 看看

我认为解决此问题的唯一方法是在重命名表之前删除触发器,然后在新数据库上重新创建它。 我编写了简单的php脚本来实现这一点 任何编程语言都可以采用相同的方法

$oldDb = "source_db"; //source database name
$newDb = "targer_db";//target database name
$tables = mysql_query('show tables from '.$oldDb);// get all tables in source database
//loop through batabase tables
while($table = mysql_fetch_row($tables)){
//get all triggers related to table
$getTriggers = 'show triggers from '.$oldDb.' where `table` = "'.$table[0].'"';
$getTriggersResult = mysql_query($getTriggers)or die("error getTriggers not done ".mysql_error());
$tableTriggers = array();//array to hold triggers sql 
//loop through table triggers
while($trigger = mysql_fetch_array($getTriggersResult)){
//get sql created the trigger
$getTriggerSql = 'show create trigger '.$oldDb.'.'.$trigger['Trigger'];
$getTriggerSqlResult = mysql_query($getTriggerSql)or die("error getTriggerSql not done ".mysql_error());
$row = mysql_fetch_row($getTriggerSqlResult);
array_push($tableTriggers,$row[2]);//store the sql in array
$dropTriggerQuery = 'drop trigger '.$oldDb.'.'.$trigger['Trigger'];//drop the trigger
$dropTriggerResult = mysql_query($dropTriggerQuery)or die("error dropTriggerQuery not done ".mysql_error());
}
//now all trigger related to table have been droped and you can rename the table
$moveTable = 'rename table '.$oldDb.'.'.$table[0].' to '.$newDb.'.'.$table[0];
$moveTableResult = mysql_query($moveTable)or die("error moveTable not done ".mysql_error());
//loop through array that holds the dropped trigger sql
foreach($tableTriggers as $trigger){
//replace old source database name with the target database from the sql
$createTriggerQuery = str_replace("`".$oldDb."`","`".$newDb."`",$trigger);
//run trigger sql to recreate it in the target database
$createTrigger = mysql_query($createTriggerQuery)or die("error createTriggerQuery not done ".mysql_error());
}
}

希望这能有所帮助

谢谢Emad。我现在就是这样做的。正在寻找解决方案,因为重命名将大大减少此过程(导出+导入)所需的时间。