当前位置: 首页 > 知识库问答 >
问题:

MySQL无法截断和删除分区表中的所有数据

谢阳成
2023-03-14

如前所述,我正在MySQL中进行并练习一个分区数据。由于我想清除所有的数据,数据仍然在那里,不能删除一次。

这是我创建的分区表。

CREATE TABLE events
(
    event_id INT unsigned NOT NULL AUTO_INCREMENT,
    inserted_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_updated_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    data JSON NOT NULL,
    KEY (event_id)
)
default charset utf8 
PARTITION BY RANGE(to_days(inserted_date))
(
PARTITION p20210301 VALUES LESS THAN (to_days('2021-04-01')),
PARTITION p20210401 VALUES LESS THAN (to_days('2021-05-01')),
PARTITION p20210501 VALUES LESS THAN (to_days('2021-06-01')),
PARTITION p20210601 VALUES LESS THAN (to_days('2021-07-01')),
PARTITION p20210701 VALUES LESS THAN (to_days('2021-08-01')),
PARTITION p20210801 VALUES LESS THAN (to_days('2021-09-01')),
PARTITION p20210901 VALUES LESS THAN (to_days('2021-10-01')),
PARTITION p20211001 VALUES LESS THAN (to_days('2021-11-01')),
PARTITION p20211101 VALUES LESS THAN (to_days('2021-12-01')),
PARTITION p20211201 VALUES LESS THAN (to_days('2022-01-01')),
PARTITION p20220101 VALUES LESS THAN (to_days('2022-02-01')),
PARTITION p20220201 VALUES LESS THAN (to_days('2022-03-01')),
PARTITION p20220301 VALUES LESS THAN (to_days('2022-04-01')),
PARTITION p20220401 VALUES LESS THAN (to_days('2022-05-01')),
PARTITION p20220501 VALUES LESS THAN (to_days('2022-06-01')),
PARTITION future VALUES LESS THAN (MAXVALUE) 
);

SELECT 
    * 
FROM 
    plover_audit_log.events

truncate table plover_audit_log.events;

delete from plover_audit_log.events;

我很好奇我的MySQL软件有问题吗?还是分区表导致了这种情况?因为我有一个没有分区的备份表,所以可以很好地使用Truncate,Delete和Select脚本。

共有2个答案

爱海
2023-03-14

分区表需要稍有不同的指令来执行截断

从所有分区中删除数据

ALTER plover_audit_log.events TRUNCATE PARTITION ALL;

从特定分区中删除所有数据

ALTER plover_audit_log.events TRUNCATE PARTITION p20210301;

参考https://dev.mysql.com/doc/refman/8.0/en/alter-table-partition-operations.html

申光临
2023-03-14

数据由ProcessList中的一个过程运行。因此首先需要从ProcessList中删除该pid。像kill pid;那样,执行truncate并检查数据是否仍然persist

 类似资料:
  • 问题内容: 在报表汇总中,我构建了一些表。后来我根本不需要它们了。有人提到要截断它们,因为这样会更快。 问题答案: 从表中删除记录会记录每次删除,并为删除的记录执行删除触发器。截断是一种更强大的命令,可清空表而不记录每一行。由于需要检查每一行上的外键,因此SQL Server阻止您使用带有引用该表的外键的表来对其进行截断。 截断通常是超快的,非常适合清除临时表中的数据。它的确保留了表的结构以备将来

  • 问题内容: 我有100个表,每个表40,000行。我想进入MySQL并从 所有* 表中删除 所有 行。 * …如果可能的话,用1条陈述? 我想保留数据库和表。 问题答案: 我不这么认为(但以前我做错了)。我倾向于做的是那些情况,这是一个两步过程。 如果您的DBMS具有命令行界面,则可以使用它来创建脚本来完成大部分工作,例如: 第一位只是简单地创建一个文件(或Windows下的文件),该文件包含所拥

  • 问题内容: 重建之前,我通常需要从PostgreSQL数据库中删除所有数据。我将如何直接在SQL中执行此操作? 目前,我设法提出了一条SQL语句,该语句返回我需要执行的所有命令: 但是,一旦有了它们,我就看不到以编程方式执行它们的方法。 问题答案: FrustratedWithFormsDesigner是正确的,PL / pgSQL可以做到这一点。这是脚本: 这将创建一个存储的函数(您只需要执行一

  • 问题内容: 列出以下MySql命令之间的区别。 删除表 tablename ; 截断表 tablename ; 从 表名 中删除1; 另外,请根据您的经验告诉我每种产品的典型使用场景。 问题答案: 在此之后,它 消失了 。没有桌子了。没有更多数据。 当您不再需要该表时,请使用它。 此后,该表为空,并且(重要地)自动递增键被重置为1。从字面上看,这就像拥有一个全新的表。 当您只需要一个空表时,请使用

  • 问题内容: 这是一个两部分的问题: 1)是否可以使用select语句基于其或其他标识符来检索数据所在的分区的名称? 例如。 2)是否可以在不删除其他分区中存储的数据的情况下截断表的单个分区? 我有一个超过十亿行的表,哈希按类别划分。只有少数类别的数据有问题,因此重新创建整个表没有意义,但是即使所有约束都处于非活动状态,从表中删除数据也花费了太长时间。 问题答案: 多亏您对 rowid 的提示,我找