【问题标题】:MySQL insert statement - on duplicate key updateMySQL插入语句-重复键更新
【发布时间】:2011-11-25 10:25:02
【问题描述】:

我有一个 MySQL 插入语句,它从现有的数据中插入数据 将Despgoods 表转换为新表DespGoods_AllDetails。两个表中的主键都是“case no”,despgoods_alldetails 中的自增列。

每个案例编号都有一个不时变化的负载编号。如何调整我的语句,以便在检测到重复键时,它只是更新该记录的加载号,而不是失败/忽略/跳过要插入的记录。有些记录不会重复,有些会。不重复的记录仍然需要插入,而重复的记录只需要更新。

我使用replace into 还是ON DUPLICATE KEY UPDATE?如何在现有查询中使用此语法?

insert ignore into despgoods_alldetails 
(`loc or exp` ,`LOC TRNSPRT DEST` ,`load number` ,`case no` ,`lot id` ,`metal mass` ,`gross mass` ,`CASE CREATION DATETIME` ,`CASE PROGERESS STATUS` ,`PROGRESS STAT DATETIME` ,`case width` ,`case height` ,`case length` ,`storage` ,`del prty` ,`CRTD DEPT` ,`CASE STATUS` ,`lab released` ,`PROD STREAM` ,`PROD SUB STREAM` ,`CSC Name` ,`Customer` ,`DAYS STANDING` ,`EXP SHIPREL` ,`LOC WHS EREL` ,`LOC CUST REL` ,`REC CHANGED AT` ,`transporttypename` ,`transporttypeid` ,`customerID`,`LOCStatus`)
SELECT `despgoods`.`loc or exp` ,`despgoods`.`LOC TRNSPRT DEST` ,`despgoods`.`load number` ,`despgoods`.`case no` ,`despgoods`.`lot id` ,`despgoods`.`metal mass` ,`despgoods`.`gross mass` ,`despgoods`.`CASE CREATION DATETIME` ,`despgoods`.`CASE PROGERESS STATUS` ,`despgoods`.`PROGRESS STAT DATETIME` ,`despgoods`.`case width` ,`despgoods`.`case height` ,`despgoods`.`case length` ,`despgoods`.`storage` ,`despgoods`.`del prty` ,`despgoods`.`CRTD DEPT` ,`despgoods`.`CASE STATUS` ,`despgoods`.`lab released` ,`despgoods`.`PROD STREAM` ,`despgoods`.`PROD SUB STREAM` ,`despgoods`.`CSC Name` ,`despgoods`.`Customer` ,`despgoods`.`DAYS STANDING` ,`despgoods`.`EXP SHIPREL` ,`despgoods`.`LOC WHS EREL` ,`despgoods`.`LOC CUST REL` ,`despgoods`.`REC CHANGED AT` ,`customers`.`transporttypename` ,`customers`.`transporttypeid` ,`customers`.`customerID` ,'loadplanned'
FROM despgoods
INNER JOIN customers
ON 
despgoods.customer = customers.customername
 ";

【问题讨论】:

    标签: mysql insert


    【解决方案1】:

    例如,您可以使用ON DUPLICATE KEY UPDATE

    ...
    FROM despgoods
    INNER JOIN customers
    ON 
    despgoods.customer = customers.customername
    ON DUPLICATE KEY UPDATE `load number` = VALUES(`load number`);
    

    您也可以使用REPLACE INTO。唯一的事情是它会删除整行然后插入。

    【讨论】:

    • 谢谢,我是继续使用插入忽略还是只插入?我将使用重复密钥更新进行测试。再次感谢。
    • 感谢 @ Jan,对于重复的键更新,我可以从嵌入的 select 语句中指定列名吗?如果我想更新多个字段,我可以使用:ON DUPLICATE KEY UPDATE load number,gross mass = VALUES(load number, gross mass);谢谢,瑞安
    • 使用重复键更新load number = VALUES(load number), gross mass = VALUES(gross mass)