Me gustaría dividir una tabla existente en 3 particiones. En el momento de la actualización de nuestra solución, un script de PowerShell se conectará al servidor MySQL y ejecutará un archivo de script.

Intenté la siguiente consulta para agregar las particiones:

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
);

La columna timestart (datetime(3) NOT NULL) es parte de la clave principal.

La partición del medio requiere valores específicos para que sea compatible con las consultas de mantenimiento ejecutadas desde un servicio de Windows en algún intervalo.

La consulta falla por dos motivos diferentes:

  1. Creación del nombre de la partición: me gustaría obtener, por ejemplo, "from20180220" cuando se ejecutó el script hoy. El mensaje de error es

    Código de error: 1064. Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '"desde" + (curdate () + 0) VALORES MENOS QUE (curdate () + 1), PARTICIÓN futuro' en la línea 5

  2. Creación del valor de la partición. Cuando se ejecute el script hoy (19 de febrero), me gustaría tener un equivalente a VALUES LESS THAN (TO_DAYS('2018-2-20').

    Código de error: 1064. No se permiten expresiones constantes, aleatorias o dependientes de la zona horaria en la función de (sub) particionamiento cerca de '), PARTICIÓN DE VALORES futuros MENOS DE MAXVALUE)' en la línea 5

Probé TO_DAYS(curdate())+1 también. En realidad, no esperaba que MySQL tuviera cierres ...

¿Cómo se pueden solucionar esos errores?

0
Bernhard Hiller 19 feb. 2018 a las 18:41

2 respuestas

La mejor respuesta

Está intentando utilizar funciones del lenguaje de manipulación de datos MySQL como CURDATE() y TO_DAYS() en su código de definición de datos. No puedes hacer eso ™.

Necesita escribir algún tipo de programa para escribir un pequeño archivo que contenga su comando Alter Table, luego ejecutar ese archivo en MySQL.

1
O. Jones 19 feb. 2018 a las 17:07

Las explicaciones de O.Jones son un poco breves.

Necesita usar otro script de lenguaje, como php, perl, python ...

Luego escribe algo como funcionaría:

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
);
1
Daniel E. 20 feb. 2018 a las 08:42