根据当前日期将分区添加到现有 table

Add partitions to existing table based on current date

我想将现有的 table 分成 3 个分区。在更新我们的解决方案时,powershell 脚本将连接到 MySQL 服务器并执行脚本文件。

我尝试了以下添加分区的查询:

Alter Table `mytable`  
  PARTITION BY RANGE (TO_DAYS(`TimeStart`)) 
(
    PARTITION start                 VALUES LESS THAN (0),
    PARTITION "from"+(curdate()+0)  VALUES LESS THAN (curdate()+1),
    PARTITION future                VALUES LESS THAN MAXVALUE
);

timestart (datetime(3) NOT NULL) 是主键的一部分。

中间的分区需要特定值以使其与 Windows 服务的维护查询 运行 在某个时间间隔兼容。

查询失败有两个不同的原因:

  1. 分区名称的创建:我想得到例如"from20180220" 今天执行脚本的时间。 错误消息是

    错误代码:1064。您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 '"from"+(curdate()+0) VALUES LESS THAN (curdate()+1), PARTITION future ' 附近使用的正确语法第 5 行

  2. 创建分区值。当今天(2 月 19 日)的脚本是 运行 时,我想要一个等同于 VALUES LESS THAN (TO_DAYS('2018-2-20') 的脚本。

    错误代码:1064。在第 5 行

    [=41]'), PARTITION future VALUES LESS THAN MAXVALUE )' 附近不允许(子)分区函数中的常量、随机或时区相关表达式=]

我也试过 TO_DAYS(curdate())+1。其实没想到MySQL会有闭包...

如何解决这些错误?

您正试图在数据定义代码中使用 MySQL data-manipulation-language 函数,例如 CURDATE()TO_DAYS()。你不能那样做™。

您需要编写某种程序来写出一个包含您的 Alter Table 命令的小文件,然后 运行 该文件在 MySQL.

O.Jones 的解释有点太短了。

您需要使用其他语言脚本,例如 php、perl、python ...

然后写一些有用的东西:

Alter Table `mytable`  
  PARTITION BY RANGE (TO_DAYS(`TimeStart`)) 
(
    PARTITION start                 VALUES LESS THAN (0),
    PARTITION from".$curdate."      VALUES LESS THAN TO_DAYS(".$nextdateTime."),
    PARTITION future                VALUES LESS THAN MAXVALUE
);