0

我计划在表格中做很多INSERT DELAYED事情MyISAM。但是这些表可能还不存在。例如,假设每天都会存在一个新表。

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

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

4

3 回答 3

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
于 2010-06-20T12:38:43.280 回答
1

每次插入检查表是否存在似乎是浪费时间。如果您需要逐日表(在我看来,它们违反了数据库中通常存在的大部分逻辑,所以我会尽量避免使用它们):

  1. 创建默认表以插入“my_logging_table”。
  2. 对该表执行所有插入/更新/删除操作。
  3. 运行每日 cronjob 以创建昨天的表('my_logging_table-2010-06-15'),并将所有昨天的记录插入其中,然后将它们从主表中删除。
  4. 如果这对您的应用程序有很大的重写,您可以使用当前表名 + 日期 ('my_logging_table-2010-06-16') 创建一个可更新视图,它只是插入到 'my_logging_table'

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

于 2010-06-16T19:58:43.693 回答
0

你可以制定一个很好的计划来完成同样的事情。

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

于 2010-06-17T02:16:44.957 回答