1

ネストされたセットをmysqlに保存しています。

次の動的 SQL を使用してノードを挿入します。

    SELECT      @myLeft := lft 
    FROM        t 
    WHERE       id = ?; 

    UPDATE      t 
    SET         rgt = rgt + 2 
    WHERE       rgt > @myLeft; 

    UPDATE      t 
    SET         lft = lft + 2 
    WHERE       lft > @myLeft; 

    INSERT INTO t 
                ( title, lft, rgt ) 
    VALUES      ( "New", @myLeft + 1, @myLeft + 2 ); 

これはうまくいきます。ただし、最初の SELECT が結果を返さない場合、階層が破損するという潜在的な問題があります。これをトランザクションにラップしても、これを防ぐことはできません。

最初の SELECT ステートメントが結果を返す場合にのみ UPDATE および INSERT ステートメントが実行されるようにするにはどうすればよいですか? (可能であれば、これを完全にSQLで行うことを本当に望んでいます。)

(事前に)ご協力いただきありがとうございます。

4

3 に答える 3

0

IF 構文を使用してこれを行うことができます: http://dev.mysql.com/doc/refman/5.5/en/if.html

于 2013-05-06T18:48:31.930 に答える
0

ifGarathが提案したように)私には非常に合理的な解決策のようです。ただし、MySQL SQL の領域内でこれを行いたい場合は、最初のクエリによって返される行数をカウントする新しい変数を導入できます。

次に、これを次のupdateandinsertステートメントのそれぞれに含めます。そのためには、最後のステートメントを using から using に変更する必要がありvaluesますselect

SELECT      @myLeft := lft , @cnt := @cnt + 1
FROM        t cross join (select @cnt := 0) const
WHERE       id = ?; 

UPDATE      t 
SET         rgt = rgt + 2 
WHERE       rgt > @myLeft and @cnt > 0;

UPDATE      t 
SET         lft = lft + 2 
WHERE       lft > @myLeft and @cnt > 0;

INSERT INTO t 
            ( title, lft, rgt ) 
    select  "New", @myLeft + 1, @myLeft + 2 
    where @cnt > 0; 
于 2013-05-06T19:04:34.737 に答える