代码之家  ›  专栏  ›  技术社区  ›  dkamins

MySQL存储过程插入延迟,但如果需要,请先创建表?

  •  0
  • dkamins  · 技术社区  · 16 年前

    我计划做很多 INSERT DELAYED 进入之内 MyISAM 桌子。但是这些表可能还不存在。例如,每天都会有一个新的表。

    因此,对于存储过程(“函数”),它似乎是一个很好的例子,而不是检测我的客户机中缺少表,然后创建然后重试插入。

    这有可能吗?它会是什么样子? 这种方法有什么缺点吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Wrikken    16 年前

    检查每个插入项是否存在表似乎是浪费时间。如果你 需要 日复一日的表格(在我看来,它们违背了通常在数据库中找到的许多逻辑,所以我尽量避免使用它们,我会这样做):

    1. 创建默认表以插入“我的日志记录表”。
    2. 执行该表上的所有插入/更新/删除操作。
    3. 运行每日cronjob以创建昨天的表(“我的日志记录表-2010-06-15”),并在其中插入所有昨天的记录,之后这些记录将从主表中删除。
    4. 如果这对您的应用程序来说是一个重写操作,那么您可以使用当前tablename+day(“我的日志记录表-2010-06-16”)创建一个可更新的视图,它只插入到“我的日志记录表”中。

    另一种方法是合并表(请参见 http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html ,每日cronjob创建“今日”表,并使用alter table语句更新合并表的表列表。

        2
  •  1
  •   Ivar Bonsaksen    16 年前

    创建一个每晚午夜前运行的计划事件,并为第二天创建日志表,这不是一个好主意吗?这样一来,你就可以一直依赖于摆在面前的桌子了。 INSERT 会发生吗?

    CREATE EVENT createLogTable
    ON SCHEDULE EVERY 1 DAY  
    STARTS '2010-6-20 23:59:00'   
    DO
        BEGIN
            SET @tablename = CONCAT('my_logging_table-',DATE(DATE_ADD(NOW(),INTERVAL 1 DAY)));
            SET @query = CONCAT('CREATE TABLE IF NOT EXISTS`',@tablename,'` (`timestamp` INT,`event` VARCHAR( 20 )) ENGINE = MYISAM');
            PREPARE createStatement FROM @query;
            EXECUTE createStatement;
            DEALLOCATE PREPARE createStatement;
        END
    
        3
  •  0
  •   santiagobasulto    16 年前

    你可以制定一个好的计划来完成这一点。

    例如,如果您有一个表“logged_users”,它将每天创建,那么您可以将一列附加到users表中,或者用 ID用户,天 列(这是更好的选择)。然后,您可以编程一个cron作业来删除过去几天的每一行,并在每天12:00执行该作业。

    推荐文章