【问题标题】:Renaming database that has tables with triggers重命名具有带触发器的表的数据库
【发布时间】:2018-04-19 09:08:39
【问题描述】:

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

我关注了https://chartio.com/resources/tutorials/how-to-rename-a-database-in-mysql/ 链接的Renaming Tables with InnoDB 部分。

但我的许多表都有 before_create 触发器。这会在执行以下命令期间引发 ERROR Trigger in wrong schema

$ mysql -u dbUsername -p"dbPassword" 目录 -sNe '显示表' |读表时; do mysql -u dbUsername -p"dbPassword" -sNe "重命名表目录。$table TO library.$table";完成

MySql 文档中甚至提到了这个问题 - https://dev.mysql.com/doc/refman/5.7/en/rename-table.html

如何重命名这些表?

【问题讨论】:

    标签: mysql database table-rename


    【解决方案1】:

    您可以将数据库复制到新数据库,然后将其删除 看着 https://dev.mysql.com/doc/refman/5.7/en/mysqldump-copying-database.html

    【讨论】:

    • 感谢 Emad。这就是我目前正在做的事情。寻找解决方案,因为重命名将大大减少此过程(导出 + 导入)所花费的时间。
    【解决方案2】:

    我认为解决此问题的唯一方法是在重命名表之前删除触发器,然后在新数据库上重新创建它。 我写了简单的 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());
    }
    }
    

    希望这会有所帮助

    【讨论】:

    • 只要有一个与目标数据库名称同名的用户(具有权限)就可以工作 - 否则,您可能在重新创建触发器时不需要 str_replace()。
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2020-06-23
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多