

# Conversión de tablas estándar en tablas ilimitadas
<a name="limitless-converting-standard"></a>

Puede convertir tablas estándar en tablas particionadas o de referencia. Durante la conversión, los datos se trasladan de la tabla estándar a la tabla distribuida y, a continuación, se elimina la tabla estándar de origen. Los datos se trasladan con el comando `INSERT INTO SELECT FROM`.

**Contents**
+ [Creación de tablas particionadas](#limitless-creating-sharded)
+ [Creación de tablas colocadas](#limitless-creating-sharded.colocated)
+ [Creación de tablas de referencia](#limitless-creating-reference)

## Creación de tablas particionadas
<a name="limitless-creating-sharded"></a>

Para crear tablas particionadas, ejecute el procedimiento `rds_aurora.limitless_alter_table_type_sharded` en tablas estándar. Este procedimiento toma una tabla estándar y una lista de columnas y, a continuación, distribuye la tabla en cuestión con la lista de columnas como clave de partición. El procedimiento se ejecuta de forma sincrónica y adquiere un bloqueo `ACCESS EXCLUSIVE` en la tabla.

Cuando el procedimiento finalice correctamente, se eliminará la tabla estándar de origen y aparecerá una tabla particionada con el mismo nombre.

El procedimiento `rds_aurora.limitless_alter_table_type_sharded` tiene la siguiente sintaxis:

```
postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('{{schema}}.{{table}}', ARRAY['{{shard_key1}}', '{{shard_key2}}', ... '{{shard_keyn}}']);
```

El procedimiento requiere los siguientes parámetros:
+ `schema`: es el esquema de la base de datos que contiene la tabla que se va a particionar. Si no se especifica el esquema, el procedimiento utiliza la `search_path`.
+ `table`: es la tabla que se va a particionar.
+ `shard_keyn`: es una matriz de columnas de tabla que se usa como clave de partición.

  Los valores clave de la partición son literales de cadena y, por lo tanto, distinguen mayúsculas de minúsculas. Si una clave de partición contiene una comilla simple ('), utilice otra comilla simple para evitarla. Por ejemplo, si una columna de la tabla se llama `customer's id`, utilice `customer''s id` como clave de partición. No es necesario que las barras invertidas (\\) y las comillas dobles (“) estén ocultas.

**nota**  
Todas las claves principales y únicas deben incluir la clave de partición. Esto significa que la clave de partición es un subconjunto de la clave principal o única.  
En las tablas particionadas, la restricción `CHECK` no admite expresiones.  
Para obtener más información, consulte [Restricciones](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Constraints).

**Creación de una tabla particionada**

El siguiente ejemplo muestra cómo crear la tabla particionada `customer` con la clave de partición `customer_id`.

1. Cree la tabla estándar.

   ```
   CREATE TABLE customer (customer_id INT PRIMARY KEY NOT NULL, zipcode INT, email VARCHAR);
   ```

1. Convierta la tabla estándar en una tabla particionada.

   ```
   postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('public.customer', ARRAY['customer_id']);
   
   postgres=> \d
   
                       List of relations
    Schema |     Name     |       Type        |       Owner
   --------+--------------+-------------------+--------------------
    public | customer     | partitioned table | postgres_limitless
    public | customer_fs1 | foreign table     | postgres_limitless
    public | customer_fs2 | foreign table     | postgres_limitless
    public | customer_fs3 | foreign table     | postgres_limitless
    public | customer_fs4 | foreign table     | postgres_limitless
    public | customer_fs5 | foreign table     | postgres_limitless
   (6 rows)
   ```

## Creación de tablas colocadas
<a name="limitless-creating-sharded.colocated"></a>

Si dos o más tablas están particionadas con la misma clave de partición, puede alinear (colocar) esas tablas de forma explícita. Cuando se colocan dos o más tablas, las filas de esas tablas que tengan los mismos valores de clave de partición se colocarán en la misma partición. La colocación ayuda a restringir algunas operaciones a una sola partición, lo que se traduce en un mejor rendimiento.

El procedimiento `rds_aurora.limitless_alter_table_type_sharded` tiene la siguiente sintaxis:

```
postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('{{schema}}.{{collocated_table}}', ARRAY['{{shard_key1}}', '{{shard_key2}}', ... '{{shard_keyn}}'], '{{schema}}.{{sharded_table}}');
```

El procedimiento requiere los siguientes parámetros:
+ `schema`: es el esquema de la base de datos que contiene las tablas que se van a colocar. Si no se especifica el esquema, el procedimiento utiliza la `search_path`.
+ `collocated_table`: es la tabla que se va a colocar.
+ `shard_keyn`: es una matriz de columnas de tabla que se usa como clave de partición.

  Debe utilizar la misma clave de partición que para la tabla particionada original, incluidos los mismos nombres y tipos de columna.
+ `sharded_table`: es la tabla particionada con la que va a colocar la `collocated_table`.

**Creación de una tabla colocada**

1. Cree la primera tabla particionada siguiendo el procedimiento descrito en [Creación de tablas particionadas](#limitless-creating-sharded).

1. Cree la tabla estándar para la tabla colocada.

   ```
   CREATE TABLE mytable2 (customer_id INT PRIMARY KEY NOT NULL, column1 INT, column2 VARCHAR);
   ```

1. Convierta la tabla estándar en una tabla colocada.

   ```
   postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('public.mytable2', 
   ARRAY['customer_id'], 'public.customer');
   
   postgres=> \d
   
                       List of relations
    Schema |     Name     |       Type        |       Owner
   --------+--------------+-------------------+--------------------
    public | customer     | partitioned table | postgres_limitless
    public | customer_fs1 | foreign table     | postgres_limitless
    public | customer_fs2 | foreign table     | postgres_limitless
    public | customer_fs3 | foreign table     | postgres_limitless
    public | customer_fs4 | foreign table     | postgres_limitless
    public | customer_fs5 | foreign table     | postgres_limitless
    public | mytable2     | partitioned table | postgres_limitless
    public | mytable2_fs1 | foreign table     | postgres_limitless
    public | mytable2_fs2 | foreign table     | postgres_limitless
    public | mytable2_fs3 | foreign table     | postgres_limitless
    public | mytable2_fs4 | foreign table     | postgres_limitless
    public | mytable2_fs5 | foreign table     | postgres_limitless
   (12 rows)
   ```

## Creación de tablas de referencia
<a name="limitless-creating-reference"></a>

Para crear tablas de referencia, ejecute el procedimiento `rds_aurora.limitless_alter_table_type_reference` en tablas estándar. Este procedimiento replica una tabla determinada en todas las particiones del grupo de particiones de base de datos y cambia el tipo de tabla por el de referencia. El procedimiento se ejecuta de forma sincrónica y adquiere un bloqueo `ACCESS EXCLUSIVE` en la tabla.

Cuando el procedimiento finalice correctamente, se eliminará la tabla estándar de origen y aparecerá una tabla de referencia con el mismo nombre.

El procedimiento `rds_aurora.limitless_alter_table_type_reference` tiene la siguiente sintaxis:

```
postgres=> CALL rds_aurora.limitless_alter_table_type_reference('{{schema}}.{{table}}');
```

El procedimiento almacenado requiere los siguientes parámetros:
+ `schema`: es el esquema de la base de datos que contiene la tabla que se va a replicar. Si no se especifica el esquema, el procedimiento utiliza la `search_path`.
+ `table`: es la tabla que se va a replicar.

**nota**  
La tabla estándar a partir de la que se crea la tabla de referencia debe contar con una clave principal.  
En las tablas de referencia, la restricción `CHECK` no admite expresiones.  
La función anterior, `limitless_table_alter_type_reference`, ha quedado obsoleta.

**Creación de una tabla de referencia**

En el siguiente ejemplo se muestra cómo crear la tabla de referencia `zipcodes`.

1. Cree la tabla estándar.

   ```
   CREATE TABLE zipcodes (zipcode INT PRIMARY KEY, details VARCHAR);
   ```

1. Convierta la tabla estándar en una tabla de referencia.

   ```
   CALL rds_aurora.limitless_alter_table_type_reference('public.zipcodes');
   
   postgres=> \d
   
                       List of relations
    Schema |     Name     |       Type        |       Owner
   --------+--------------+-------------------+--------------------
    public | customer     | partitioned table | postgres_limitless
    public | customer_fs1 | foreign table     | postgres_limitless
    public | customer_fs2 | foreign table     | postgres_limitless
    public | customer_fs3 | foreign table     | postgres_limitless
    public | customer_fs4 | foreign table     | postgres_limitless
    public | customer_fs5 | foreign table     | postgres_limitless
    public | zipcodes     | foreign table     | postgres_limitless
   (7 rows)
   ```

   El resultado muestra la tabla particionada `customer` y la tabla de referencia `zipcodes`.