如果在TRUNCATE和SELECT INTO之间发送查询,则没有数据.使用MySQL innoDB



使用MySQL数据库时,我创建的存储过程和事件计时器出现问题。我制作了一个空表,通过SELECT INTO从另一个表中填充数据。在填充之前,我截断当前数据。它只用于跟踪自当前日期起2个月内发生的日志条目。

这将一个350k以上的日志表变成了大约750,这确实加快了报告查询的速度。

问题是,如果客户端精确地在TRUNCATE语句和SELECT INTO语句之间发送查询(考虑到EVENT设置为每1分钟运行一次,这很有可能),则查询不会返回行。。。

我已经研究过在运行此PROCEDURE时锁定表上的读取,但在STORED PROCEDURES中不允许锁定。

有人能想出一个(最好)不需要改造的变通办法吗?我真的需要在这里指出正确的方向。

谢谢,最大

我建议使用另一种方法,而不是截断表,然后选择…

您可以将新数据集选择到新表中。接下来,使用单个RENAME命令,将新表重命名为现有表,并将现有表重命名为某个备份名称。

RENAME TABLE existing_table TO backup_table, new_table TO existing_table;

这是一个单一的原子操作。。。因此,客户端不可能在清空数据之后但在重新填充数据之前读取数据。

或者,您可以将TRUNCATE更改为DELETE FROM,然后将其与SELECT INTO:一起封装在事务中

START TRANSACTION
    DELETE FROM YourTable;
    SELECT INTO YourTable...;
COMMIT