我想将现有表分成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服务运行的维护查询兼容。
查询失败的原因有两个:
创建分区名称:我想得到例如“from20180220”当剧本今天执行。 错误消息是
错误代码:1064。您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'“from”附近使用正确的语法+(curdate()+ 0)VALUES LESS(curdate()+ 1),PARTITION future'在第5行
创建分区值。当脚本今天(2月19日)运行时,我希望等同于VALUES LESS THAN (TO_DAYS('2018-2-20')
。
错误代码:1064。(子)分区函数中的常量,随机或时区相关表达式不允许在')附近,PARTITION future VALUES比MAXVALUE(第5行)
我也试过了TO_DAYS(curdate())+1
。实际上,我没想到MySQL会关闭......
如何解决这些错误?
答案 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.
}