我有一个包含以下列的表(oc_product):
产品_id | 型号 |
---|---|
1 | 42 |
2 | 43 |
3 | 44 |
我想做
product_id = model
UPDATE oc_product SET product_id = model WHERE model != product_id;
但是我还有另一个带有
query
列的表 (oc_seo_url),该列包含 oc_product 表中的 ID,我也需要更改这些值。
查询 | 关键字 |
---|---|
|
测试1 |
|
测试2 |
|
测试3 |
我想出了如何一次更新一个值:
SET @idValue = 1;
SET @seoIdValue = CONCAT("product_id=", @idValue);
SELECT model INTO @modelValue FROM oc_product WHERE product_id LIKE @idValue;
SET @seoModelValue = CONCAT("product_id=", @modelValue);
UPDATE oc_product SET product_id = @modelValue WHERE model = @modelValue;
UPDATE oc_seo_url SET query = @seoModelValue WHERE query = @seoIdValue;
查询后的结果:
产品_id | 型号 |
---|---|
42 | 42 |
2 | 43 |
3 | 44 |
和
查询 | 关键字 |
---|---|
|
测试1 |
|
测试2 |
|
测试3 |
但是我怎样才能一次更新所有内容呢?我需要为此使用循环吗?我想要得到:
产品_id | 型号 |
---|---|
42 | 42 |
43 | 43 |
44 | 44 |
和
查询 | 关键字 |
---|---|
|
测试1 |
|
测试2 |
|
测试3 |
我用 while 循环尝试了它,但我不知道它在 MySQL 中应该如何工作:
CREATE PROCEDURE dowhile()
BEGIN
SELECT product_id INTO @idValue FROM oc_product WHERE product_id != model;
SELECT model INTO @modelValue FROM oc_product WHERE product_id LIKE @idValue;
WHILE (@idValue != @modelValue) DO
SET @seoIdValue = CONCAT("product_id=", @idValue);
SET @seoModelValue = CONCAT("product_id=", @modelValue);
UPDATE oc_product SET product_id = @modelValue WHERE model = @modelValue;
UPDATE oc_seo_url SET query = @seoModelValue WHERE query = @seoIdValue;
END WHILE;
END;
您不需要任何 dowhile() 首先您需要更新 oc_seo_url 表,因为这是我们需要首先更新查询列的依赖表。然后您可以更新 oc_product 表
update oc_seo_url os
left join oc_product op on op.product_id = cast(SUBSTRING_INDEX(os.query,'=',-1) AS UNSIGNED)
set os.query = concat(SUBSTRING_INDEX(os.query,'=',1),'=',cast(op.model as char) );
UPDATE oc_product SET product_id = model WHERE model != product_id;