2011-09-23 65 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

这就是为什么我建议使用临时列或专用列。但是如果他对数据模型没有权利,那么它可能是唯一的解决方案。如果一个关键字等于一个值,它可能非常有趣...... –