0

だから私は、ユーザーがプロジェクトAKA「ガイド」を作成し、その作成されたプロジェクトにステップを追加できるWebサイトを開発しています。

たとえば、私のステップテーブル構造:

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

ご覧のとおり、このテーブルには id、projectID (別のテーブルのプロジェクト ID を参照)、stepOrder の 3 つのフィールドがあります。ここで、ユーザーが 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 に答える