The Cusp of Helix

Fertile Forest Model

ノードの削除

ツリー構造データにおけるノード削除には、次の 3種類があります。

  1. 指定ノードを部分木ごと削除する
  2. 指定ノードの子孫ノードだけ削除する
  3. 指定ノードを削除して、その子孫ノードを繰り上げる

指定ノードを部分木ごと削除する

指定ノードを部分木ごと削除するクエリは、部分木の検索クエリの WHERE 句がそのまま使えます。

[B] の部分木を検索するクエリ[B] の部分木を削除するクエリ
mysql> SELECT * FROM ff_tables WHERE ff_queue >= 1 AND ff_queue <= COALESCE( (SELECT MIN(ff_queue) - 1 FROM ff_tables WHERE ff_queue > 1 AND ff_depth <= 1 ), 0x7fffffff ) ; mysql> DELETE FROM ff_tables WHERE ff_queue >= 1 AND ff_queue <= COALESCE( (SELECT MIN(ff_queue) - 1 FROM ff_tables WHERE ff_queue > 1 AND ff_depth <= 1 ), 0x7fffffff ) ;

指定ノードの子孫ノードだけ削除する

指定ノードの子孫ノードだけ削除するのも、部分木クエリと同じく検索クエリの応用で簡単に実装できます。以下は、 [B] の子孫ノードの削除文です。

mysql> DELETE FROM ff_tables WHERE ff_queue > 1 AND ff_queue <= COALESCE( (SELECT MIN(ff_queue) - 1 FROM ff_tables WHERE ff_queue > 1 AND ff_depth <= 1 ), 0x7fffffff ) ;

指定ノードを削除して、その子孫ノードを繰り上げる

指定ノードを削除してその子孫ノードを繰り上げるのは少し煩雑です。指定ノードを削除する DELETE 文と子孫ノードを繰り上げるための UPDATE 文を発行する必要があります。

以下は、 [B] を削除して [B] の子孫ノードを繰り上げる手順です。

mysql> BEGIN; mysql> DELETE FROM ff_tables WHERE ff_queue = 1 ; mysql> UPDATE ff_tables SET ff_depth = ff_depth - 1 WHERE ff_queue > 1 AND ff_queue <= COALESCE( (SELECT MIN(ff_queue) - 1 FROM ff_tables WHERE ff_queue > 1 AND ff_depth <= 1 ), 0x7fffffff ) ; mysql> COMMIT;