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