所以这是我的问题,我编写了一个存储过程来完成以下任务。在表events中,对于不再存在的场所可能存在潜在的事件。并非所有事件都与场所相关联,但是在其场所ID字段中具有整数值的事件,否则为NULL(或可能为零,但已考虑在内)。场所会定期从我们的系统中删除,如果发生这种情况,则无法在该确切时间删除与该场所相关的所有事件。而是在以后的某个时间定期运行任务,该任务会删除每个具有场所ID的事件,而该事件不再引用场所表中的现有记录。我为此编写了一个存储过程,它似乎可以工作。

这是存储过程:

DROP PROCEDURE IF EXISTS delete_synced_events_orphans;
DELIMITER $$
CREATE PROCEDURE delete_synced_events_orphans()
BEGIN

    DECLARE event_count int(11) DEFAULT 0;
    DECLARE active_event_id int(11) DEFAULT 0;
    DECLARE active_venue_id int(11) DEFAULT 0;
    DECLARE event_to_delete_id int(11) DEFAULT NULL;

    CREATE TEMPORARY TABLE IF NOT EXISTS possible_events_to_delete (
        event_id int(11) NOT NULL,
        venue_id_temp int(11) NOT NULL
    ) engine = memory;

    # create an "array" which is a table that holds the events that might need deleting
    INSERT INTO possible_events_to_delete (event_id, venue_id_temp) SELECT `events`.`id`, `events`.`venue_id` FROM `events` WHERE `events`.`venue_id` IS NOT NULL AND `events`.`venue_id` <> 0;
    SELECT COUNT(*) INTO `event_count` FROM `possible_events_to_delete` WHERE 1;

    detector_loop: WHILE `event_count` > 0 DO
        SELECT event_id INTO active_event_id FROM possible_events_to_delete WHERE 1 LIMIT 1;
        SELECT venue_id_temp INTO active_venue_id FROM possible_events_to_delete WHERE 1 LIMIT 1;

        # this figures out if there are events that need to be deleted
        SELECT `events`.`id` INTO event_to_delete_id FROM `events`, `venues` WHERE `events`.`venue_id` <> `venues`.`id` AND `events`.`id` = active_event_id AND `events`.`venue_id` = active_venue_id;

        #if no record meets that query, the active event is safe to delete
        IF (event_to_delete_id <> 0 AND event_to_delete_id IS NOT NULL) THEN
            DELETE FROM `events` WHERE `events`.`id` = event_to_delete_id;
            #INSERT INTO test_table (event_id_test, venue_id_temp_test) SELECT `events`.`id`, `events`.`venue_id` FROM `events` WHERE `events`.`id` =  event_to_delete_id;
        END IF;

        DELETE FROM possible_events_to_delete WHERE `event_id` = active_event_id AND `venue_id_temp` = active_venue_id;
        SET `event_count` = `event_count` - 1;

    END WHILE;

END $$
DELIMITER ;


这是有问题的两个表的表结构:

CREATE TABLE IF NOT EXISTS events (
    id int(11) NOT NULL,
    event_time timestamp NOT NULL,
    venue_id_temp int(11) NOT NULL
);

CREATE TABLE IF NOT EXISTS venues (
    event_id int(11) NOT NULL,
    venue_id_temp int(11) NOT NULL
);


存储过程按书面方式工作,但是我想知道如何使它更好地运行。似乎要进行很多额外的处理才能实现其目标。有没有更好的方法可以查询手边的数据,或者还有其他我不知道的有用的命令和关键字,可以使我更好地完成此任务(减少行数,减少计算量)。我仍在学习如何使用存储过程,因此我将使用它们尽可能实际地完成任务,我想了解如何进行此特定查询以更好地利用MySQL的全部功能。谢谢大家。

最佳答案

一切都简单得多:

而已。 :)
您认为当务之急,试图说出MySQL如何完成任务。但是SQL是一种声明性语言,旨在说明要做什么。

10-05 21:28
查看更多