2012-09-13 25 views
2

我有一個MySQL表,我需要分成兩個。目前該表包含關於兩個鬆散相關實體的信息。 例如,實體可以是公司的員工和他被標記的公司的筆記本電腦。 下表解釋了我的示例。我有具有以下列mysql將表分成2個不同的列名

employee_id,employee_name,employee_detail,join_date,laptop_id,laptop_type,laptop_tagged_date,laptop_details,laptop_make. 

我需要此表分成2如下所示的表employeeemployee表,而筆記本電腦的列

employee_id,employee_name,employee_detail,join_date. 

laptop表EMPLOYEE_ID爲關鍵。

employee_id,laptop_id,laptop_type,laptop_tagged_date,laptop_details,laptop_make 

下面的語句是當前數據庫設計

  • employee表大量使用後端代碼實現。最後的代碼是用java和php編寫的,後面的 。
  • employee表無法重命名.Implies我不想創建2 新表。我想保留employee表,但從中刪除所有的 筆記本電腦信息。
  • 添加新行/現有行每日更新。

我的問題是

  1. 有沒有我可以按照從單個表的當前設計到新 建議設計一個平滑過渡 的設計方案?
  2. 是否有任何最佳實踐要遵循以確保順利進行 轉換。
  3. 您能否建議/重新指導我完成此任務的步驟。

回答

2
  1. Backup現有的數據庫:

    mysqldump my_db > backup.sql 
    
  2. 創建一個新的,laptop(我沒有定義在下面我舉的例子索引或外鍵約束,但你應該做什麼適合您的數據結構):

    CREATE TABLE laptop 
    SELECT employee_id, 
         laptop_id, 
         laptop_type, 
         laptop_tagged_date, 
         laptop_details, 
         laptop_make 
    FROM employee 
    WHERE FALSE; 
    
  3. Define triggers原始表每種類型的寫操作(插入/更新/刪除)轉發到新表:

    CREATE TRIGGER employee_insert AFTER INSERT ON employee FOR EACH ROW 
        INSERT INTO laptop VALUES (
        NEW.employee_id, 
        NEW.laptop_id, 
        NEW.laptop_type, 
        NEW.laptop_tagged_date, 
        NEW.laptop_details, 
        NEW.laptop_make 
    ); 
    
    CREATE TRIGGER employee_update AFTER UPDATE ON employee FOR EACH ROW 
        UPDATE laptop SET 
        employee_id   = NEW.employee_id, 
        laptop_id   = NEW.laptop_id, 
        laptop_type   = NEW.laptop_type, 
        laptop_tagged_date = NEW.laptop_tagged_date, 
        laptop_details  = NEW.laptop_details, 
        laptop_make   = NEW.laptop_make 
        WHERE 
        employee_id  <=> OLD.employee_id, 
        laptop_id   <=> OLD.laptop_id, 
        laptop_type  <=> OLD.laptop_type, 
        laptop_tagged_date <=> OLD.laptop_tagged_date, 
        laptop_details  <=> OLD.laptop_details, 
        laptop_make  <=> OLD.laptop_make; 
    
    CREATE TRIGGER employee_delete AFTER DELETE ON employee FOR EACH ROW 
        DELETE FROM laptop WHERE 
        employee_id  <=> OLD.employee_id, 
        laptop_id   <=> OLD.laptop_id, 
        laptop_type  <=> OLD.laptop_type, 
        laptop_tagged_date <=> OLD.laptop_tagged_date, 
        laptop_details  <=> OLD.laptop_details, 
        laptop_make  <=> OLD.laptop_make; 
    
  4. 空的新表(任何事物的觸發自插),然後,內同一交易,使用INSERT ... SELECT從原始表複製到該文件中的所有現有數據:

    START TRANSACTION; 
    
    DELETE FROM laptop; 
    INSERT INTO laptop 
    SELECT employee_id, 
         laptop_id, 
         laptop_type, 
         laptop_tagged_date, 
         laptop_details, 
         laptop_make 
    FROM employee; 
    
    COMMIT; 
    
  5. 徹底搜索您的代碼庫(包括數據庫存儲的程序)進行訪問原始表筆記本列的所有操作。注意是否每個操作:

    • 只讀取這些列;

    • 只寫入這些列;或

    • 都從這些列中讀取和寫入(例如UPDATE employee SET laptop_tagged_date = laptop_tagged_date + INTERVAL 1 WEEK WHERE ...)。

  6. 修改的讀操作,以使用新的表,分割操作該讀取和寫入到單獨的步驟(例如UPDATE employee JOIN laptop ON ... SET employee.laptop_tagged_date = laptop.laptop_tagged_date + INTERVAL 1 WEEK WHERE ...)。

    這個改變不需要自動實現,因爲原始表和新表將被觸發器保持同步:因此,應用程序的某些部分可以從新表中讀取,而其他部分可以從新表中讀取,而其他部分則繼續使用原始表。

    直到您確信此步驟已完成之後才能繼續下一步,因爲下一步將導致表變得不同步。您甚至可以使用MySQL用戶權限來防止寫入新表(觸發器除外),直到您確信完成此步驟。

  7. 修改寫入操作以使用新表。

    這個改變不需要原子地實現,因爲對原始表的任何寫入都會被觸發器轉發到新的表中:因此,應用程序的某些部分可以寫入新表,而其他部分則可以寫入新表,而其他部分則繼續寫入原始表。

  8. 從原表中刪除列:

    ALTER TABLE employee 
        DROP COLUMN laptop_id, 
        DROP COLUMN laptop_type, 
        DROP COLUMN laptop_tagged_date, 
        DROP COLUMN laptop_details, 
        DROP COLUMN laptop_make; 
    
1

,如果你想擁有2個物理不同的表,你可以適應塞巴斯蒂安·M.回答這樣:

創建具有相應數據的筆記本電腦桌外化他們

CREATE TABLE laptop AS 
SELECT DISTINCT employee_id,laptop_id,laptop_type,laptop_tagged_date,laptop_details,laptop_make 
FROM employee 
WHERE ... 

提供employee_laptop視圖模仿員工的行爲並獲得向後兼容性

create view employee_laptop as 
select employee_id, e.employee_name,e.employee_detail,e.join_date, 
     l.laptop_id,l.laptop_type,l.laptop_tagged_date,l.laptop_details,l.laptop_make 
from employee e join laptop l using(employee_id); 

那麼你有所有緯度從員工表中刪除不必要的列

1

我可以建議你一個可能的方式,當你創建laptop表使用下面的查詢類型: -

create table laptop select employee_id,laptop_id,laptop_type, 
laptop_tagged_date,laptop_details,laptop_make from 
employee; 

在這上面創建laptop表後過程中,您可以從employee表中刪除指定的列,以獲取新員工表中的相關字段。

employee表中刪除列。

alter table employee 
drop column laptop_id,laptop_type,laptop_tagged_date,laptop_details,laptop_make; 

現在新employee表具有以下字段:

employee_id,employee_name,employee_detail,join_date 

現在laptop表具有以下字段:

mployee_id,laptop_id,laptop_type, 
    laptop_tagged_date,laptop_details,laptop_make 

希望它會幫助你。

相關問題