2

MySQL 5.0.95 を使用しています。顧客がイベントのゲスト リストを作成できる Web フォームがあります。ゲスト リストはオフィス マネージャーによって承認され、そこからフロント デスクがその日の承認された訪問者を取得します。

スペースを節約するために問題を煮詰めました。_events と _guests の 2 つのテーブルがあります。2 つの一致するアーカイブ テーブルもあります。

CREATE TABLE IF NOT EXISTS visitor._events (
eventId int( 11 ) NOT NULL AUTO_INCREMENT,
eventName varchar( 200 ) NOT NULL,
PRIMARY KEY ( eventId ) 
);

CREATE TABLE IF NOT EXISTS  visitor._archived_events (
eventId int( 11 ) NOT NULL,
eventName varchar( 200 ) NOT NULL,
PRIMARY KEY ( eventId ) 
);

CREATE TABLE IF NOT EXISTS  visitor._guests (
guestId int( 11 ) NOT NULL AUTO_INCREMENT,
eventId int( 11 ) NOT NULL,
guestName varchar( 200 ) NOT NULL,
PRIMARY KEY ( guestId ) 
);

CREATE TABLE IF NOT EXISTS  visitor._archived_guests (
guestId int( 11 ) NOT NULL,
eventId int( 11 ) NOT NULL,
guestName varchar( 200 ) NOT NULL,
PRIMARY KEY ( guestId ) 
);

イベントが終了したら、事務局長がデータベースからイベント (およびそのゲストの記録) を削除できるようにしたいのですが、記録管理のためにそれらのイベントを 1 年間アーカイブしたいと考えています。

DELETED のレコードを _guests テーブルから _archive_guests テーブルにコピーする TRIGGER を作成しました。

DELIMITER $$

DROP TRIGGER IF EXISTS TR_A_DEL_guests $$

CREATE TRIGGER TR_A_DEL_guests DELETE ON _guests FOR EACH ROW BEGIN

 INSERT IGNORE INTO _archived_guests (
   guestId,
   guestName
 ) VALUES (
   OLD.guestId,
   guestName
 );

END $$

DELIMITER ;

また、_guests テーブルから特定の eventID のすべてのゲスト レコードを削除し、削除されたレコードを _events テーブルから _archived_events テーブルにコピーする TRIGGER もあります。

DELIMITER $$

DROP TRIGGER IF EXISTS TR_A_DEL_events $$

CREATE TRIGGER TR_A_DEL_events AFTER DELETE ON _events FOR EACH ROW BEGIN

 DELETE FROM _guests WHERE eventId = OLD.eventId;

 INSERT IGNORE INTO _archived_events (
   eventId,
   eventName
 ) VALUES (
   OLD.idEventId,
   OLD.eventName
 );

END $$

DELIMITER ;

つまり、レコードが _events から削除されると、そのレコードは _archived_events に移動され、そのイベントのすべての _guests レコードが _archived_guests テーブルにコピーされます。

私が抱えている問題は、顧客がゲスト リストを編集しているときに、ゲスト レコードを削除するとアーカイブされることです。ゲストを編集/削除できますが、予定を完全に削除することはできません。

私の質問: 最初に適切な _guest レコード (eventId = OLD.eventId) のそれぞれを _archived_guests にコピーし、次に _event レコードを _archived_events にコピーする、削除されたイベントで 1 つの TRIGGER のみを使用する方法はありますか?

4

1 に答える 1

2

あなたが正しく理解しているなら、試してみてください

DELIMITER $$

DROP TRIGGER IF EXISTS TR_A_DEL_events_guests $$
CREATE TRIGGER TR_A_DEL_events_guests 
BEFORE DELETE ON _events 
FOR EACH ROW 
BEGIN
    -- Archive guests
    INSERT IGNORE INTO _archived_guests (guestId, eventId, guestName)
    SELECT guestId, eventId, guestName
      FROM _guests
     WHERE eventId = OLD.eventId;
    -- Delete guests 
    DELETE 
      FROM _guests 
     WHERE eventId = OLD.eventId;
    -- Archive event before deleting
    INSERT IGNORE INTO _archived_events (eventId, eventName)
    VALUES (OLD.eventId, OLD.eventName);
END $$

DELIMITER ;

これがSQLFiddleのデモです

于 2013-05-23T21:32:11.163 に答える