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

MySQL存储过程插入延迟,但如果需要先创建表?,mysql,stored-procedures,insert,myisam,Mysql,Stored Procedures,Insert,Myisam,我计划在MyISAM表中插入大量的INSERT DELAYED。但这些表格可能还不存在。比如说,每天都会有一个新表 因此,与其在我的客户机中检测到缺少表并创建然后重试插入,不如将其作为存储过程(“函数”)的一个好例子 这是可能的,它会是什么样子? 这种方法有什么缺点吗?在每次插入时检查表是否存在似乎是浪费时间。如果需要逐日表(在我看来,它们违背了数据库中通常存在的许多逻辑,因此我尽量避免它们,我会): 创建默认表以插入“我的日志记录表” 对该表执行所有插入/更新/删除操作 运行每日cronjob

我计划在
MyISAM
表中插入大量的
INSERT DELAYED
。但这些表格可能还不存在。比如说,每天都会有一个新表

因此,与其在我的客户机中检测到缺少表并创建然后重试插入,不如将其作为存储过程(“函数”)的一个好例子

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

在每次插入时检查表是否存在似乎是浪费时间。如果需要逐日表(在我看来,它们违背了数据库中通常存在的许多逻辑,因此我尽量避免它们,我会):

  • 创建默认表以插入“我的日志记录表”
  • 对该表执行所有插入/更新/删除操作
  • 运行每日cronjob以创建昨天的表(“my_logging_table-2010-06-15”),并在其中插入所有昨天的记录,然后从主表中删除这些记录
  • 如果您的应用程序需要重写,您可以使用当前的tablename+day('my_logging_table-2010-06-16')创建一个可更新的视图,该视图只插入'my_logging_table'

  • 另一种方法是合并表(请参阅),每天使用cronjob创建“今日”表,并使用alter table语句更新合并表的表列表。

    您可以制定一个很好的方案来实现这一点


    例如,如果您有一个每天都要创建的表“Logged_users”,那么您可以在users表中添加一列,或者使用ID_USER,day列创建一个额外的表(这将是一个更好的选择)。然后,您可以编写一个CRON作业来删除过去几天中的每一行,并在每天上午12:00执行该作业。

    创建一个每晚午夜前运行的计划事件,并为第二天创建日志表,这不是一个好主意吗。这样,您就可以始终依靠在任何
    插入之前创建的表了

    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
    

    谢谢你的回答。我实际上是建议先插入,然后只有在插入失败时才处理表的创建。我同意在每次插入时检查表是非常浪费的!日报表的用途是处理大量不断传入的数据。您的第三步将是数据密集型的,几乎每天都会使系统停止一次。这基本上就是我试图避免的。如果是这样,我会走合并表的路线&每天创建一个表,并将其添加到合并表中(可能是唯一的表,MySQL不会介意)。