0

こんにちは私は4つのテーブルを持っています

最初の表はメニュー に列があります:

  1. ID番号PK
  2. menu.Idへのparent_id番号FK
  3. タイトル文字の変化(250)
  4. softdelbooleanのデフォルトはfalse

2番目の表はページです

  1. PKとしてのID
  2. menu.idへのFKとしてのmenu_id
  3. page.idへのFKとしてのpage_id
  4. softdelbooleanのデフォルトはfalse

3番目の表は記事です:

  1. PKおよびFKとしてpage.idへのID
  2. softdelbooleanのデフォルトはfalseに設定されています

および4番目のテーブルarticle_lang

  1. PKとしてのpartial_id
  2. article.idへのFKとしてのid
  3. 言語文字
  4. softdelbooleanのデフォルトはfalseに設定されています

また、たとえば200のidを持つメニューを'delete'(つまり、softdel trueに設定)するときに更新ステートメントを作成する必要があります。また、parent_id = 200のすべてのメニューと、menu_id = menus_idのすべてのページ、およびpage_idの記事にsoftdel=falseを設定します。 =pages.idなど...

私はそれを行うことが可能な更新ステートメントを1つだけ必要としますか?

JPAクエリまたはEJBクエリを作成できれば素晴らしいと思います:)

オラクルで私はステートメントを書きます:

update pub_menu pm set softdel = 0 where pm.id in (
with menu_tree(id, parent_id) as (
  select 
    t1.id , t1.parent_id
    from menu t1
    where t1.id = 454

    union all
    select 
    t2.id , t2.parent_id
      from menu_tree
      join menu t2 on menu_tree.id = t2.parent_id
)
select id from menu_tree

)

update menu_page pmp set softdel = 1 where pmp.menu_id in (
with menu_tree(id, parent_id) as (
  select 
    t1.id , t1.parent_id
    from menu t1
    where t1.id = 454

    union all
    select 
    t2.id , t2.parent_id
      from menu_tree
      join menu t2 on menu_tree.id = t2.parent_id
)
select id from menu_tree

)

その動作はしますが、私はそれをそのようにするのは間違っています:/

4

4 に答える 4

1

何かのようなもの:

with recursive menu_tree (id, parent_id) as (
   select id, parent_id
   from menu
   where id = 200
   union all 
   select c.id, c.parent_id
   from menu c
     join menu_tree p on p.id = c.parent_id
)
, deleted_menus (menu_id) as (
   update menu
      set softdel = true
   where id in (select id from menu_tree)
   returning menu.id
),
deleted_pages (page_id) as (
   update page
      set softdel = true
   where menu_id in (select menu_id from deleted_menus)
   returning page.id
),
deleted_articles (article_id) as (
   update article
     set softdel = true
   where page_id in (select page_id from deleted_pages)
)
update article_lang
   set softdel = true
where id in (select article_id from deleted_articles);
于 2013-02-27T13:55:09.313 に答える
0

複数の更新を CTE と組み合わせることができます。

WITH u1 AS (UPDATE menu SET softdel = TRUE WHERE menu.id = 200),
     u2 AS (UPDATE menu SET softdel = FALSE WHERE menu.parent_id = 200),
     u3 AS (...),
     u4 AS (...),
     -- and so on
SELECT 1
于 2013-02-27T13:53:52.113 に答える
0

それらを削除して外部キーをカスケードさせると、より簡単になります。

ただし、追加の削除を行う短いトリガー関数を作成することはできます。最初の 3 つのテーブルごとに 1 つ必要ですが、基本的にはすべて同じです。各 ROW の AFTER トリガーで、OLD.id に基づいてチェーン内の次のテーブルを更新する必要があります。

マニュアルのトリガー機能の例。

于 2013-02-27T13:49:25.917 に答える