0

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

例如我的步骤表结构:

------------------------------------
 |  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     |
 -----------------------------------

那么我该如何实现呢?

4

1 回答 1

1

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

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

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

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

于 2013-06-07T14:50:16.713 回答