Переименование базы данных с таблицами с триггерами

0

Мне нужно переименовать мою базу данных и понять, что, создав новую БД и переименовав таблицы в новое имя БД, можно переименовать БД

Я следил за Renaming Tables with InnoDB разделе Renaming Tables with InnoDB по ссылке https://chartio.com/resources/tutorials/how-to-rename-a-database-in-mysql/.

Но многие мои таблицы имеют триггеры before_create. Это вызывает Trigger in wrong schema ERROR Trigger in wrong schema во время выполнения следующей команды:

$ mysql -u dbUsername -p Каталог "dbPassword" -sNe 'show tables' | при чтении таблицы; do mysql -u dbUsername -p "dbPassword" -sNe "Каталог RENAME TABLE. $ table TO library. $ table"; сделанный

Эта проблема даже упоминается в документации MySql - https://dev.mysql.com/doc/refman/5.7/en/rename-table.html

Как я могу переименовать такие таблицы?

Теги:
database
table-rename

2 ответа

0

Я думаю, что единственный способ решить эту проблему - сбросить триггер, прежде чем переименовать таблицу, а затем снова создать ее в новой базе данных. я написал простой скрипт 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());
}
}

надеюсь, это может помочь

0

вы можете скопировать базу данных в новую базу данных, а затем отбросить ее на https://dev.mysql.com/doc/refman/5.7/en/mysqldump-copying-database.html

  • 0
    Спасибо, Эмад. Вот как я сейчас это делаю. Ищите решение, поскольку переименование значительно сократит время, затрачиваемое на этот процесс (экспорт + импорт).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню