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

时间:2018-02-19 15:41:41

标签: mysql database-partitioning

我想将现有表分成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
);

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

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

查询失败的原因有两个:

  1. 创建分区名称:我想得到例如“from20180220”当剧本今天执行。 错误消息是

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

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

    错误代码:1064。(子)分区函数中的常量,随机或时区相关表达式不允许在')附近,PARTITION future VALUES比MAXVALUE(第5行)

  3. 我也试过了TO_DAYS(curdate())+1。实际上,我没想到MySQL会关闭......

    如何解决这些错误?

2 个答案:

答案 0 :(得分:1)

您正在尝试在数据定义代码中使用MySQL数据操作语言函数,如CURDATE()TO_DAYS()。你不能那样做。

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

答案 1 :(得分:1)

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

你需要使用另一种语言脚本,如php,perl,python ......

然后写一些像工作的东西:

List<String> linesAfterFinish = new ArrayList<>();
try(BufferedReader br = new BufferedReader(new FileReader(file))){
    boolean conditionWasMeet = false;
    for(String line; (line = br.readLine()) != null){
        if(conditionWasMeet){
            linesAfterFinish.add(line);
        }
        if(!conditionWasMeet && line.startsWith("Finished !!!!")){
            conditionWasMeet = true;
        }
    }
}catch(Exception e){
    e.printStackTrace();
}


if(!linesAfterFinish.isEmpty()){
    /// Write the content of linesAfterFinish to the other file.
}