删除一行时更新同一表中的其他行

时间:2013-02-02 07:39:59

标签: mysql

表格让我们称之为测试

 ----------------------------
 |  id  |  catid  |  value  |
 |  1   |    1    |   1     |
 |  2   |    1    |   2     |
 |  3   |    2    |   1     |
 |  4   |    1    |   3     |
 |  5   |    1    |   4     |
 |  6   |    1    |   5     |
 |  7   |    2    |   2     |
 ----------------------------

假设我从表中删除了第2行。现在表格将成为:

 ----------------------------
 |  id  |  catid  |  value  |
 |  1   |    1    |   1     |
 |  3   |    2    |   1     |
 |  4   |    1    |   3     |
 |  5   |    1    |   4     |
 |  6   |    1    |   5     |
 |  7   |    2    |   2     |
 ----------------------------

所以在catid1中,没有值2.因此,到目前为止,值将变为1,3,4,5 ...... ....

目标我需要将值更新为从之前的值中减去1,以便连续性得到维持(如果符合条件,则所有值都会增加1,即bgger是否超过删除的值)。

CODE 删除后,我正在尝试执行更新查询。

UPDATE     `test` 
SET        `value` = 
      (

         SELECT t.param FROM (

                         SELECT `value`-1 AS  param
                         FROM `test`
                         WHERE          
                         `catid` = 1 AND `value` > 2

                       ) AS t

       ) 
WHERE 
      `catid` = 1
      AND   `value` > 2 

现在,最内部的查询将返回值> 2的所有行,其中更新需要字符串或数字的标量值。

所以问题是如何在最内层查询中返回与更新查询定位相关的行?

e.g。如果更新查询尝试更新ID为4的行,则最里面的查询将检索具有相同行ID value列,并将其返回到外部查询(扣除1之后)

这有什么替代方法吗?

1 个答案:

答案 0 :(得分:1)

JOIN具有此子查询的表格如下:

UPDATE test t1
INNER JOIN
( 
  SELECT 
    id, catid, value - 1 AS value
  FROM test
  WHERE catid = 1
    AND value > 2
) AS t2 ON t1.id = t2.id
SET t1.value = t2.value;

SQL fiddle demo

但是不需要这个子查询,你可以直接这样做:

UPDATE test t1
SET value = value - 1
WHERE catid = 1
  AND value > 2;

<击> 但是,您可能需要修复该列id以匹配以下值:

UPDATE test AS t1
INNER JOIN
(
  SELECT 
    *, 
    (@rownum := @rownum + 1) AS newID
  FROM test, (SELECT @rownum := 0) AS t
  ORDER BY Id
) AS t2 ON t1.id = t2.id
SET t1.id = t2.newId,
    t1.value = CASE 
                 WHEN t1.catid = 1 AND t1.value > 2 THEN t2.value - 1 
                 ELSE t1.value 
               END;

Updated SQL Fiddle Demo

<击>