0

次のような 2 つのバージョン管理されたテーブルがあります。

アイテム:

  • ID
  • rev_id
  • 名前
  • 削除された

サブアイテム:

  • ID
  • rev_id
  • 名前
  • 親ID
  • 削除された

http://kristiannielsen.livejournal.com/6745.htmlから、次のようにテーブルからオブジェクトのすべての最新バージョンを取得するのは非常に簡単で高速であることがわかります。

SELECT a.name, a.id, a.rev_id, a.deleted FROM Items a
INNER JOIN (SELECT id, MAX(rev_id) AS rev_id FROM Items GROUP BY id) b
ON (a.id= b.id AND a.rev_id b.rev_id)

しかし、ユーザーがレコードを削除するとき、deleted is 1 を新しいレコードとして新しいレコードを挿入できればクールです。ここで見つけました: https://stackoverflow.com/a/4039781/672989次のようなものを挿入できます:

INSERT INTO table (id, rev_id, name, deleted)
SELECT id, rev_id, name, 1 FROM Items WHERE id = 1 ORDER BY rev_id DESC LIMIT 1

しかし、Items テーブル内のアイテムが削除された場合 = 1 の場合、サブアイテム テーブルでも parent_id == items.id であるすべてのサブアイテムに対して、deleted = 1 の新しいレコードを追加したいと考えています。これを行う簡単な方法は何ですか?1つのクエリで可能ですか? また、別のサブサブアイテムテーブルがある場合、どうすれば同じことを達成できますか?

4

1 に答える 1

0

deleted親がそのようにマークされている場合の値をオーバーライドする「挿入時」トリガーを作成する必要があります。

DELIMITER ;;

CREATE TRIGGER foo BEFORE INSERT ON Items FOR EACH ROW
  IF (SELECT deleted FROM Items WHERE id = NEW.parent_id) THEN
    SET NEW.deleted := 1;
  END IF;;

DELIMITER ;
于 2012-05-07T23:59:21.720 に答える