簡體   English   中英

將數據從MySQL表傳輸到其他表

[英]Transfer data from MySQL table to a different table

我有一個數據庫,在我的計算機上,我們簡單地稱它為“ db”,其中有一些表,這些表中有多個列和數據。 我有一個使用該數據庫存儲配置元素和其他內容的軟件。

現在,我發布了我的軟件的新版本,僅對數據庫進行了少量修改,即某些列可能已添加到表中或已刪除(但未重命名列)。

我必須保留所有數據,因此我想將其傳輸到數據庫的新“版本”中。

我的想法:

  • 將“ db”重命名為“ db_old”。
  • 將新數據庫安裝為“ db_new”,並在新列中使用默認值
  • 對於每個表,獲取“ db_new”中存在的“ db_old”中所有列的列表
  • 使用INSERT INTO ... SELECT將舊內容放回db_new。
  • 刪除舊數據庫並使用我的新數據庫。

您認為它可以工作嗎? 您有任何簡單的解決方案嗎?

另外,我絕對不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM