【发布时间】:2010-06-16 19:43:36
【问题描述】:
我计划在MyISAM 表中做很多INSERT DELAYED。但是这些表可能还不存在。比方说,例如每天都会存在一个新表。
因此,与其检测我的客户端中没有表并创建然后重试插入,这似乎是一个存储过程(“函数”)的好案例。
这可能吗?它会是什么样子? 这种方法有什么缺点吗?
【问题讨论】:
标签: mysql stored-procedures insert myisam
我计划在MyISAM 表中做很多INSERT DELAYED。但是这些表可能还不存在。比方说,例如每天都会存在一个新表。
因此,与其检测我的客户端中没有表并创建然后重试插入,这似乎是一个存储过程(“函数”)的好案例。
这可能吗?它会是什么样子? 这种方法有什么缺点吗?
【问题讨论】:
标签: mysql stored-procedures insert myisam
每次插入检查表是否存在似乎是浪费时间。如果您需要逐日表格(在我看来,它们违反了数据库中通常存在的大部分逻辑,因此我会尽量避免使用它们):
另一种方法是 MERGE 表(请参阅 http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html),每日 cronjob 创建“今天”表并使用 alter table 语句更新合并表的表列表。
【讨论】:
创建一个在每晚午夜前运行的计划事件并为第二天创建日志表不是一个想法。这样您就可以始终依赖在任何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
【讨论】:
你可以制定一个很好的计划来完成同样的事情。
例如,如果您有一个每天都会创建的表“Logged_users”,您可以在 users 表中追加一列,或者创建一个带有 ID_USER, DAY 列的额外表(这将是一个更好的选择)。然后,您可以编写一个 CRON 作业以删除过去几天的每一行,并在每天凌晨 12:00 执行该作业。
【讨论】: