[英]Transfer data from MySQL table to a different table
我有一个数据库,在我的计算机上,我们简单地称它为“ db”,其中有一些表,这些表中有多个列和数据。 我有一个使用该数据库存储配置元素和其他内容的软件。
现在,我发布了我的软件的新版本,仅对数据库进行了少量修改,即某些列可能已添加到表中或已删除(但未重命名列)。
我必须保留所有数据,因此我想将其传输到数据库的新“版本”中。
我的想法:
您认为它可以工作吗? 您有任何简单的解决方案吗?
另外,我绝对不是SQL专家...而且我尝试了此操作(不查看是否已删除该列):
SELECT
GROUP_CONCAT(COLUMN_NAME
SEPARATOR ',')
INTO @colList FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'db_old'
AND TABLE_NAME = 'configuration';
INSERT
INTO db_new.configuration (SELECT @colList)
SELECT @colList FROM
db_old.configuration;
但是它无法将第二个@colList替换为有效列表...您还能在这个问题上帮助我吗?
谢谢大家,祝你有美好的一天!
首先,您应该转储数据库数据库并创建一个.sql文件。 根据您的数据库数据,该文件甚至可以以GB为单位。 该SQL文件将包含您的所有表以及这些表中的所有数据。 我建议您打开并查看文件。 然后,您应该使用这个新创建的文件,并将其用于将所有数据导入新数据库。 它将所有这些表,数据放入这个新的数据库中。
这是这样做的方法。 首先创建SQL文件:
mysqldump -h [SeverIpAddress] -u [UserName] -p[password] YourDbname > db_backup.sql
如果是远程服务器,请使用-h [SeverIpAddress]。 万一它驻留在您自己的系统中,则无需使用它。
然后,您应该创建新的数据库,假设为DB_new。 创建完成后,使用use命令切换到该位置。
use DB_new
完成后,现在导入您在使用source命令之前创建的.SQl文件。
source YourSQLFilePath
在您的情况下, source db_backup.sql
好。 如果有人遇到过同样的问题,这是解决方案。
首先,承认您有一个名为“ myDatabase”的数据库,其中包含一个要“升级”的名为“ myTable”的表,即,您想通过添加/删除列来修改表结构,但将数据保留在其中。
第一步是删除外键(如果有)并重命名“ myTable”:
USE `myDatabase`;
ALTER TABLE `myTable` DROP FOREIGN KEY `my_fk_constraint`;
ALTER TABLE `myTable` RENAME TO `old_myTable`;
第二步是例如通过使用SOURCE导入新的表结构。
SOURCE C:/new_table_structure.sql
第三步是可选的,但如果表中有很多列,则可能需要这样做:
USE `myDatabase`;
SET GLOBAL group_concat_max_len = 4294967295;
第四步是存储以下例程:
delimiter //
DROP PROCEDURE IF EXISTS updateConf//
CREATE PROCEDURE updateConf(IN dbName TEXT, IN old_table TEXT, IN new_table TEXT, IN primary_key_name TEXT)
BEGIN
-- get column count in old table
SELECT count(*)
INTO @colNb
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = dbName
AND TABLE_NAME = old_table;
-- get string with all column names from old_table
SELECT GROUP_CONCAT(COLUMN_NAME)
INTO @colNames1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = dbName
AND TABLE_NAME = old_table;
SET @colNames1 = CONCAT(@colNames1, ',');
-- get string with all column names from new_table
SELECT GROUP_CONCAT(COLUMN_NAME)
INTO @colNames2
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = dbName
AND TABLE_NAME = new_table;
-- variables initialization
SET @cpt = 1; -- column number counter
SET @pos = 1; -- position of column name first char
SET @vir = 1; -- next comma position
-- start of loop
label: LOOP
IF @cpt <= @colNb THEN
SET @vir = LOCATE(',',@colNames1,@pos); -- localize next comma
SET @colName = SUBSTRING(@colNames1, @pos, @vir - @pos); -- get column name
SET @pos = @vir + 1; -- update next column position
-- if column is in both tables
IF FIND_IN_SET(@colName, @colNames2) AND @colName != primary_key_name THEN
SET @execut = CONCAT("INSERT INTO ", new_table, " (", primary_key_name, ",", @colName, ") SELECT ", primary_key_name, ",", @colName, " FROM ", old_table, " ON DUPLICATE KEY UPDATE ", new_table, ".", @colName, " = ", old_table, ".", @colName);
PREPARE stmt FROM @execut;
EXECUTE stmt;
END IF;
SET @cpt = @cpt + 1; -- counter increment
-- when all columns parsed
ELSE
LEAVE label; -- end of loop
END IF;
END LOOP label;
END //
delimiter ;
最后一步是在表上调用该过程,并删除临时表:
CALL updateConf( 'myDatabase', 'old_myTable', 'myTable', 'primaryKeyName' );
DROP TABLE `old_myTable`;
瞧! 只是不要忘记放回您放下的外键:)
当然可以用更好的方法来完成,但是我让它可以正常工作。
谢谢大家 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.