MySQL存储过程INSERT DELAYED,但如果需要,首先创建CREATE TABLE?

时间:2010-06-16 19:43:37

标签: mysql stored-procedures insert myisam

我打算在INSERT DELAYED个表中执行大量MyISAM。但这些表可能还不存在。比方说,例如每天都会有一张新表格。

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

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

3 个答案:

答案 0 :(得分:1)

检查表是否存在似乎是浪费时间检查每个插入。如果你需要日复一日的表(在我看来,他们无视数据库中常见的大部分逻辑,所以我试着避免它们,我会):

  1. 创建默认表以插入'my_logging_table'。
  2. 在该表上执行所有插入/更新/删除操作。
  3. 运行每日cronjob以创建昨天的表('my_logging_table-2010-06-15'),并在其中插入所有昨日记录,之后将其从主表中删除。
  4. 如果要对您的应用程序进行大量重写,您可以使用当前tablename + day('my_logging_table-2010-06-16')创建一个可更新的视图,该视图只插入'my_logging_table'
  5. 另一种方法是MERGE表(参见http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html),每日cronjob创建'今日'表&使用alter table语句更新合并表的表列表。

答案 1 :(得分:1)

创建在午夜前每晚运行的预定事件并不是一个想法,并创建第二天的日志表。那样你总是可以依赖在任何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

答案 2 :(得分:0)

你可以制定一个好的方案来实现同样的目标。

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