我正在将旧数据库导入到我们程序的新版本中,我想知道是否有办法不从转储中导入某些列/表,并在导入其他表/列时重命名它们?我知道我可以在理论上编辑转储文件,但这似乎是一个 hack,到目前为止,我的编辑都无法处理打开 1.3 gb 文件(是的,我已经在这里阅读了关于这个问题的问题。不,到目前为止,没有一个答案对我有用。)。
建议?
我正在将旧数据库导入到我们程序的新版本中,我想知道是否有办法不从转储中导入某些列/表,并在导入其他表/列时重命名它们?我知道我可以在理论上编辑转储文件,但这似乎是一个 hack,到目前为止,我的编辑都无法处理打开 1.3 gb 文件(是的,我已经在这里阅读了关于这个问题的问题。不,到目前为止,没有一个答案对我有用。)。
建议?
我会说将它导入一个临时数据库并实时进行更改 - 可能应用一个预构建的脚本来执行必要的操作:
DROP TABLE ....
DROP TABLE ....
DROP TABLE ....
ALTER TABLE ..... DROP column ....
然后将完成的结果复制到生产数据库中。
这也可以很好地自动化。
它可能比找到一个编辑转储的工具更快,问题更少(或者,经常使用这些东西,尝试五种不同的工具并发现没有一个很好用)。
可以通过拒绝权限来不导入某些表,并使用 --force 作为命令行选项。
无法导入某些列或重命名它们(至少无需编辑转储文件或在导入后进行修改)。
我的建议是:
如果您担心转储包含多个数据库,mysql 命令行工具有一个 -o 标志来只导入一个。
假设你有两个数据库,你可以重命名 OldDB 中的所有表(只要确保前缀没有在任何表名中使用,因为重命名有一个字符串替换)......</p>
USE olddb;
DROP PROCEDURE IF EXISTS rename_tables;
DELIMITER ||
CREATE PROCEDURE rename_tables(
IN plz_remove BOOLEAN
)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tab VARCHAR(64);
DECLARE mycursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE() FROM DUAL)
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN mycursor;
myloop: LOOP
FETCH mycursor INTO tab;
IF done THEN
LEAVE myloop;
END IF;
IF plz_remove THEN
SET @sql = CONCAT(
'RENAME TABLE ', tab, ' TO ', REPLACE(tab, 'olddb_', '')
);
ELSE
SET @sql = CONCAT('RENAME TABLE ', tab, ' TO olddb_', tab);
END IF;
-- construct due to RENAME × CONCAT / variables.
PREPARE s FROM @sql;
EXECUTE s;
END LOOP;
CLOSE mycursor;
END ||
DELIMITER ;
-- append 'olddb_'.
CALL rename_tables(false);
-- […]
-- rename back after dump.
CALL rename_tables(true);
…然后转储并导入NewDB。
$ mysqldump -hlocalhost -uroot -p --complete-insert --routines --default-character-set=utf8 olddb > olddb.sql
$ mysql -hlocalhost -uroot -p --default-character-set=utf8 newdb < olddb.sql
这会给你(例如):
USE newdb;
SHOW TABLES;
+------------------+
| Tables_in_newdb |
+------------------+
| bar |
| foo |
| olddb_company |
| olddb_department |
| olddb_user |
| user |
+------------------+
进一步阅读/基于: