MySQL RANGE 表按月分区 2 年记录

MySQL RANGE table partitioning by months for 2 years records

提问人:darlisa 提问时间:11/16/2023 更新时间:11/16/2023 访问量:24

问:

我正在探索 MySQL 表分区,我有一个有 2 年记录的表。我正在尝试创建一个类似于我拥有的当前表的新表,以便我可以将数据从表复制到这个新表,该表的记录将按 2021 年和 2022 年按月分区。我在下面有这个查询,但这遇到了一个我不太理解的错误Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed

CREATE TABLE TnTest (
  id bigint NOT NULL AUTO_INCREMENT,
  tnDate date NOT NULL,
  tnDateTime datetime NOT NULL,
  tnType varchar(40) NOT NULL,
  checksum varchar(255) NOT NULL,
  PRIMARY KEY (id, tnDate),
  UNIQUE KEY checksum (checksum, tnDate),
)ENGINE=InnoDB AUTO_INCREMENT=50015 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  PARTITION BY RANGE (extract(year_month from 'tnDate'))
(
  PARTITION P0 VALUES LESS THAN (202101),
  PARTITION P1 VALUES LESS THAN (202102),
  PARTITION P2 VALUES LESS THAN (202103),
  PARTITION P3 VALUES LESS THAN (202104),
  PARTITION P4 VALUES LESS THAN (202105),
  PARTITION P5 VALUES LESS THAN (202106),
  PARTITION P6 VALUES LESS THAN (202107),
  PARTITION P7 VALUES LESS THAN (202108),
  PARTITION P8 VALUES LESS THAN (202109),
  PARTITION P9 VALUES LESS THAN (202110),
  PARTITION P10 VALUES LESS THAN (202111),
  PARTITION P11 VALUES LESS THAN (202112),
  PARTITION P12 VALUES LESS THAN (202201),
  PARTITION P13 VALUES LESS THAN (202202),
  PARTITION P14 VALUES LESS THAN (202203),
  PARTITION P15 VALUES LESS THAN (202204),
  PARTITION P16 VALUES LESS THAN (202205),
  PARTITION P17 VALUES LESS THAN (202206),
  PARTITION P18 VALUES LESS THAN (202207),
  PARTITION P19 VALUES LESS THAN (202208),
  PARTITION P20 VALUES LESS THAN (202209),
  PARTITION P21 VALUES LESS THAN (202210),
  PARTITION P22 VALUES LESS THAN (202211),
  PARTITION P23 VALUES LESS THAN (202212),
  PARTITION P24 VALUES LESS THAN MAXVALUE
);

从查询中,我尝试创建一个总共有 24 个分区的表(由 2021 年和 2022 年的月份组成),以便当我将记录复制到该表时,它将根据相应年份的月份进行分区。

mysql-8.0 表分区 范围分区

评论

0赞 Akina 11/16/2023
研究在什么情况下必须使用什么引号字符......stackoverflow.com/q/11321491/10138734

答:

0赞 Bill Karwin 11/16/2023 #1

引用列名时,不要将它们放在单引号内。使用反引号分隔标识符,或者如果不需要分隔,则可以将其保留为裸露(不带引号)。

不對:

PARTITION BY RANGE (extract(year_month from 'tnDate'))

正确:

PARTITION BY RANGE (extract(year_month from tnDate))

也正确:

PARTITION BY RANGE (extract(year_month from `tnDate`))

将列名放在单引号内使其成为字符串文本,而不是列标识符。

MySQL在看到带引号的字符串文字时,会假设它可能是一个带引号的日期。也就是说,你可能已经写了.这将是其他查询中的合法表达式,但不允许将其用作分区表达式。MySQL甚至不检查带引号的字符串是否为有效日期,它会返回错误,因为无论如何,分区表达式中都不允许这样做。EXTRACT(YEAR_MONTH FROM ...))EXTRACT(YEAR_MONTH FROM '2023-11-16'))