删除其中一个后,mysql更新表中的行

时间:2013-06-07 14:43:26

标签: mysql count reset

所以我正在开发一个网站,允许用户创建项目A.K.A“指南”,然后为该创建的项目添加步骤。

例如我的步骤表结构:

------------------------------------
 |  id  |  projectid  |  stepOrder |
 |  1   |     103     |      1     |
 |  2   |     103     |      2     |
 |  3   |     103     |      3     |
 |  4   |     103     |      4     |
 |  5   |     104     |      1     |
 |  6   |     104     |      2     |
 |  7   |     104     |      3     |
 -----------------------------------

因此,您可以看到此表有3个字段:id,projectID(在另一个表中引用项目ID)和stepOrder。现在,如果用户决定从103项目中删除第2步,我们将留下这样的内容:

 ------------------------------------
 |  id  |  projectid  |  stepOrder |
 |  1   |     103     |      1     |
 |  3   |     103     |      3     |
 |  4   |     103     |      4     |
 |  5   |     104     |      1     |
 |  6   |     104     |      2     |
 |  7   |     104     |      3     |
 -----------------------------------

正如您所看到的,因为我们删除了第2步,现在它从第1步直接跳到第3步。但我需要它是这样的:

 ------------------------------------
 |  id  |  projectid  |  stepOrder |
 |  1   |     103     |      1     |
 |  3   |     103     |      2     |
 |  4   |     103     |      3     |
 |  5   |     104     |      1     |
 |  6   |     104     |      2     |
 |  7   |     104     |      3     |
 -----------------------------------

那我怎么能实现这个目标呢?

1 个答案:

答案 0 :(得分:1)

通常这是作为后续更新在应用程序端完成的:

DELETE FROM guide_steps WHERE id=?
UPDATE guide_steps SET stepOrder=stepOrder-1 WHERE stepOrder>? AND projectid=?

您可以将其锁定在一个事务中,以避免在没有另一个步骤的情况下完成一步。

也可以将它包装在一个触发器中,但这通常是一个坏主意,因为维护它们可能很复杂,并且很容易“触发快乐”。