четверг, 15 сентября 2022 г.

mysql - некоторые хитрости

 Задача - скопировать таблицы из одной базы в другую, поменяв имя таблиц (добавить префикс). Можно сделать через mysqldump | sed | mysql, а можно так:

Первое заполнение можно сделать примерно так

SELECT concat('CREATE TABLE maindb.', TABLE_NAME, ' LIKE tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';

SELECT concat('INSERT INTO maindb.', TABLE_NAME, ' SELECT * FROM tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';

Но.. надо сохранить вывод в файл (например через mysql -b -e '...' > tmp.sql) и выполнить, а можно прямо в консоли mysql, будет дальше.

Без временного файла это будет выглядеть так

T1=$(mysql -b -s -r -e "SELECT concat('CREATE TABLE maindb.prefix_', TABLE_NAME, ' LIKE tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';")

mysql -e "$T1"

T2=$(mysql -b -s -r -e "SELECT concat('INSERT INTO maindb.prefix_', TABLE_NAME, ' SELECT * FROM tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';")

mysql -e "$T2"

Но, заполнили первый раз базу, обновляем - а теперь нужно сначала удалить все старые таблицы.

https://phoenixnap.com/kb/mysql-drop-table

(нюанс: мария 10.5 - не работает select * FROM information_schema.tables WHERE @schema = database();  - нужно убрать @schema = database(); )