2015-10-27 33 views
0

我有一個數據庫,我們簡單地稱之爲'db',在我的計算機上,有幾個表,這些表中有多個列和數據。 我有一個軟件使用這個數據庫來存儲配置元素和一些其他的東西。將數據從MySQL表傳輸到不同的表

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

我必須保留所有數據,所以我想將它轉移到我的數據庫的新「版本」。

我想到了什麼:

  • 重命名 'DB' 到 'db_old'。
  • 在新列
  • 對於每個表安裝新的數據庫作爲「db_new」,使用缺省值,讓所有從「db_old」存在於「db_new」
  • 使用的列的列表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的有效清單...你能幫我解決這個問題嗎?

謝謝大家,祝你有美好的一天!

+0

請問您的舊錶中的列是否與新表中的列匹配? – Takarii

+0

新表可能有新列,某些列可能已被刪除。但是通用的列名稱相同。但是,如果這太複雜了,我們只是說新表可能只有新列,並且沒有列被刪除。 – Yggdrazil

+0

你應該能夠保持它作爲一個簡單的'insert into'語句。我最近不得不做同樣的事情。 'INSERT INTO database2.table(column_name(s))SELECT(column_name(s)) FROM database1.table'這會將數據插入到新數據庫中,並將新列保留爲空/空 – Takarii

回答

0

確定。如果有人遇到同樣的問題,這裏是解決方案。首先,承認你有一個名爲'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`; 

瞧!只是不要忘了放回你掉:)


就一定能更好的方式來完成的外鍵,但我得到這個才能正常工作。

謝謝大家!

0

您應該首先轉儲您的數據庫數據庫並創建一個.sql文件。根據您的數據庫數據,該文件甚至可以使用GB。這個SQL文件將包含你所有的表格和這些表格內的所有數據。我會建議你打開並查看文件。 然後,您應該使用這個新創建的文件並使用它將所有數據導入到新的數據庫中。它將把所有這些表,數據放入這個新的數據庫中。

以下是如何做到這一點。首先創建SQL文件:

mysqldump -h [SeverIpAddress] -u [UserName] -p[password] YourDbname > db_backup.sql 

在遠程服務器的情況下使用-h [SeverIpAddress]。如果它在你自己的系統中被解決,你不需要使用它。

然後您應該創建您的新DB,可以說DB_new。一旦創建,使用使用命令切換到它。

use DB_new 

完成後,現在導入我們在使用source命令之前創建的.SQl文件。

source YourSQLFilePath 

在你的情況,source db_backup.sql

+0

這是不需要的,因爲您可以直接從一個數據庫傳輸到另一個數據庫。 – Takarii

+0

謝謝,但它不能工作。該轉儲將提取我的old_db體系結構(即列)和數據。我需要的是將舊數據插入具有更多(或更少)列的表中。 – Yggdrazil

相關問題