2011-09-23 63 views
0

我已經將一個excel文檔導入到MySQL中以整理並更好地使用數據,但是我在運行更新時遇到了問題。從另一個表(FK)更新多個行的值

所有的表格都用作下面的例子;

表 asset_register 電話 SIM 隊

的asset_register包含以下的cols;

id INT, 
serialNo VARCHAR, 
simNo INT, 
team VARCHAR 

問題是我想創建一個團隊表,並在asset_register表中引用teamId。

這有道理嗎?而不是存儲實際的團隊名稱,我希望將外鍵添加到團隊表中。

問題在於更新從excel導入的asset_register表中的所有數據。幾乎與用戶數量相同(〜500),我需要編寫查詢或存儲過程來更新所有這些數據。

我認爲一個存儲過程將是最好的選擇。到目前爲止,我擁有以下內容,但它將團隊的值更新爲'NULL'而不是teamId。

DELIMITER // 
    DROP PROCEDURE `updateCrews`// 
    CREATE DEFINER=`root`@`localhost` PROCEDURE `updateCrews`() 

    BEGIN 

DECLARE rowCount INT; 
DECLARE crewNameFromRegister VARCHAR(7); 
DECLARE currentRow INT; 
DECLARE newCrewdata VARCHAR(7); 

SET rowCount=(SELECT COUNT(*) FROM asset_register); 
SET currentRow = 1; 

myUpdateLoop: WHILE (currentRow < rowCount) DO 

    SET crewNameFromRegister = (SELECT crewID FROM asset_register WHERE id = currentRow); 
    SET newCrewData = (SELECT id FROM crews WHERE crewName = crewNameFromRegister); 
    UPDATE asset_register SET crewID = newCrewData; 

    SET currentRow = currentRow + 1; 

END WHILE myUpdateLoop; 

    END// 

    DELIMITER ; 

任何幫助將不勝感激,有可能是一個更好的方式來做到這一點,在正確的方向輕推將是巨大的。

+0

你不是應該使用'WHERE'條款與'UPDATE'聲明?如果你處理的最後一行有一個NULL組,那麼它將使用你的註冊表中的所有行。 –

+0

SET crewNameFromRegister =(SELECT crewID FROM asset_register WHERE id = currentRow); - 船員ID從哪裏來?它不在您提供的asset_register的定義中。 –

回答

1

如果我很好理解你的問題,我建議你在本文中使用mysql手冊中描述的mutli表更新語法:MutliTableUpdate。你嘗試通過一個id來改變一個字符串關鍵字,而不是數據類型/轉換。

的想法應該是:

UPDATE asset_register, crews 
SET asset_register.crewID = crews.id 
WHERE crews.crewName = asset_register.crewID 

但是,如果你使用其他的列柱做出來,檢查中間結果也可能是更安全的。

關於第一個例子:

id INT, 
serialNo VARCHAR, 
simNo INT, 
team VARCHAR 

您可以添加teamID列,執行更新和重命名列

+0

+1指向正確的方向,-1使用隱式連接1989調用,他們希望他們的意外交叉連接回來。 – Johan

+0

非常感謝,那正是我想要做的。創建一個隔離溫度欄以保存新數據。我昨天試過,但沒有引用查詢中的第二個表。非常感謝。 – dougied82

+0

這就是爲什麼我建議使用臨時列或專用列。但是如果他對數據模型沒有權利,那麼它可能是唯一的解決方案。如果一個關鍵字等於一個值,它可能非常有趣...... –