MySQL-复制或更新一个表中的更改行

时间:2019-04-24 08:19:13

标签: mysql

我有一个像这样的数据库表:

group | detailsID | price
EK    |         1 |  1.40
EK    |         2 |  1.50
EK    |         3 |  1.60
H     |         1 |  2.40
H     |         2 |  2.50

现在,我要将数据从“ EK”组复制到“ H”组,因此必须为detailsID 1和2调整detailsID的价格,并且必须为“组”插入detailsID 3的条目H”。

如何使用一个或两个MySQL查询呢?

谢谢!

2 个答案:

答案 0 :(得分:2)

我们可以尝试用INSERT INTO ... SELECT做一个ON DUPLICATE KEY UPDATE

INSERT INTO yourTable (`group`, detailsID, price)
SELECT 'H', detailsID, price
FROM yourTable t
WHERE `group` = 'EK'
ON DUPLICATE KEY UPDATE price = t.price;

但是,这假定(group, detailsID)上存在一个唯一密钥。如果这不可能,那么这种方法将行不通。

作为替代方案,我可以分两个步骤进行。首先,删除H组记录,然后插入所需的更新后的H记录。

DELETE
FROM yourTable
WHERE `group` = 'H';

INSERT INTO yourTable (`group`, detailsID, price)
SELECT 'H', detailsID, price
FROM yourTable
WHERE `group` = 'EK';

我使用上述方法是因为单个更新不能满足您的要求,因为还需要插入新记录。

请注意,应避免使用保留的MySQL关键字(例如GROUP)命名列和表。

答案 1 :(得分:0)

您也可以尝试使用存储过程实现以下代码。很简单,不难理解。您可能需要根据要求修改数据类型并优化代码。

DELIMITER $$;

DROP PROCEDURE IF EXISTS update_H $$;

CREATE PROCEDURE update_H()
BEGIN

DECLARE finished INTEGER DEFAULT 0;
DECLARE `group_col` varchar(255) DEFAULT "";
DECLARE `detaildid_col` varchar(255) DEFAULT "";
DECLARE `price_col` varchar(255) DEFAULT "";

DECLARE  H_FOUND INTEGER DEFAULT 0;

DECLARE pull_data CURSOR FOR select `group`, `detaildid`, `price` from test.newtab WHERE `group` = 'EK';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;


OPEN pull_data;
traverse_data: LOOP

FETCH pull_data INTO group_col, detaildid_col, price_col;
IF finished = 1 THEN 
LEAVE  traverse_data;
END IF;

SET H_FOUND = (SELECT count(*) from test.newtab where `group` = 'H' AND `detaildid` = detaildid_col);

IF ( H_FOUND = 1 ) THEN
        UPDATE  test.newtab SET `price` = price_col where `group` = 'H' AND `detaildid` = detaildid_col;
ELSE
    INSERT INTO test.newtab (`group`, `detaildid`, `price`)  VALUES ('H', detaildid_col, price_col); 
END IF;

END LOOP traverse_data;
CLOSE pull_data;

END $$;
DELIMITER ;

您可以通过执行call update_H();

来调用此过程