Todos los productos
Search
Centro de documentos

PolarDB:Convierta tablas particionadas

Última actualización: Sep 05, 2026

Utilice ALTER TABLE para convertir una tabla entre tres estrategias de particionamiento: común (sin particionar), particionada por rango y particionada por rango con intervalos.

Requisitos previos

Antes de empezar, asegúrese de que cuenta con:

  • Un clúster de PolarDB for MySQL 8.0 con la versión de revisión 8.0.2.2.0 o posterior

Para comprobar su versión de revisión, consulte Query the engine version.

Cómo funciona

Una tabla particionada por rango con intervalos usa un punto de transición para separar las particiones de rango definidas explícitamente de las particiones de intervalo administradas automáticamente. Todos los datos hasta el punto de transición se almacenan en particiones de rango con nombre. Los datos posteriores a ese punto desencadenan la creación automática de particiones con el intervalo especificado; no es obligatorio usar ADD PARTITION manualmente.

Cuando se elimina la definición de intervalo de una tabla, todas las particiones de intervalo existentes se convierten en particiones de rango estándar.

Reglas de conversión

Conversión

Compatible

Método

Tabla común → tabla particionada por rango con intervalos

Sí

ALTER TABLE ... PARTITION BY

Tabla particionada por rango con intervalos → tabla común

No

—

Tabla particionada por rango → tabla particionada por rango con intervalos

Sí

ALTER TABLE ... PARTITION BY (8.0.2.2.0+) o SET INTERVAL (8.0.2.2.1+)

Tabla particionada por rango con intervalos → tabla particionada por rango

Sí

ALTER TABLE ... PARTITION BY (8.0.2.2.0+) o SET INTERVAL() (8.0.2.2.1+)

Después de convertir una tabla en una tabla particionada por rango con intervalos, la base de datos crea nuevas particiones automáticamente cuando se insertan datos más allá del punto de transición. No se pueden agregar particiones de forma explícita a una tabla particionada por rango con intervalos.

Sintaxis

Sintaxis 1 — redefinir el esquema de particionamiento completo:

ALTER TABLE table_name partition_options;

Donde partition_options es:

PARTITION BY
    { RANGE{(expr) | COLUMNS(column_list)} }
    { INTERVAL(type, expr) | INTERVAL(expr) }
    [(partition_definition [, partition_definition] ...)]

Donde partition_definition es:

PARTITION partition_name
        [VALUES LESS THAN {expr | MAXVALUE}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

Sintaxis 2 — alternar el intervalo en una tabla particionada por rango existente (requiere 8.0.2.2.1 o posterior):

ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };

Deshabilite el particionamiento por intervalo y vuelva a una tabla particionada por rango: llame a SET INTERVAL() sin argumentos.

Parámetros

Parámetro

Descripción

table_name

Nombre de la tabla

RANGE(expr)

Expresión de partición. Debe dar como resultado un valor INT; los tipos de cadena no son compatibles

column_list

Lista de columnas para RANGE COLUMNS(); las expresiones no son compatibles

INTERVAL(type)

Tipo de tiempo del intervalo. Valores compatibles: YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND. Si se omite, se usa el tipo numérico

INTERVAL(expr)

Valor del intervalo. Cuando type es SECOND, el valor debe ser 60 o mayor

MAXVALUE

Valor máximo de la partición

engine_name

Nombre del motor de almacenamiento

Convierta una tabla común en una tabla particionada por rango con intervalos

Defina una partición de rango inicial y establezca el punto de transición. Los datos insertados más allá de ese límite provocan la creación automática de particiones mensuales (o de cualquier otro intervalo).

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
);

-- Convert to an interval range partitioned table.
-- Partition p0 holds data before 2021-10-01 (the transition point).
-- Data from 2021-10-01 onward creates monthly partitions automatically.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

Convierta una tabla particionada por rango en una tabla particionada por rango con intervalos

Existen dos métodos disponibles. Ambos agregan un intervalo a una tabla particionada por rango existente.

Método 1: redefina el esquema de particionamiento (requiere 8.0.2.2.0 o posterior)

Utilice este método para cambiar tanto la clave de partición como el intervalo en una sola instrucción.

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) (
  PARTITION p0 VALUES LESS THAN(10000000)
);

-- Redefine the partition scheme: switch the key to orderdate and add a monthly interval.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

Método 2: establezca el intervalo en una tabla particionada por rango existente (requiere 8.0.2.2.1 o posterior)

Utilice este método cuando la tabla ya está particionada por la clave correcta y solo necesita habilitar el particionamiento por intervalo.

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(orderdate) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

-- Activate interval partitioning with a monthly interval.
ALTER TABLE orders SET INTERVAL(MONTH, 1);

Convierta una tabla particionada por rango con intervalos en una tabla particionada por rango

Al eliminar la definición de intervalo, todas las particiones de intervalo existentes se convierten en particiones de rango con nombre.

Método 1: redefina el esquema de particionamiento (requiere 8.0.2.2.0 o posterior)

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
  PARTITION p0 VALUES LESS THAN(10000000)
);

-- Redefine without the INTERVAL clause to convert to a range partitioned table.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

Método 2: borre el intervalo (requiere 8.0.2.2.1 o posterior)

Deshabilite el particionamiento por intervalo: llame a SET INTERVAL() sin argumentos. Las particiones de intervalo existentes se convierten en particiones de rango.

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
  PARTITION p0 VALUES LESS THAN(10000000)
);

-- Disable interval partitioning. Existing interval partitions are retained as range partitions.
ALTER TABLE orders SET INTERVAL(); /* Switch an interval range partitioned table to a range partitioned table without specifying the interval type and value. */