我有一个像这样的数据库表:
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查询呢?
谢谢!
答案 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();