ALTER TABLE APPEND - Amazon Redshift

ALTER TABLE APPEND

Adjunta filas en una tabla de destino al mover datos de una tabla de origen existente. Los datos de la tabla de origen se mueven a las columnas correspondientes de la tabla de destino. El orden de la columna no es importante. Después de que se agregan los datos correctamente a la tabla de destino, la tabla de origen queda vacía. Por lo general, ALTER TABLE APPEND es mucho más rápida que una operación CREATE TABLE AS o INSERT INTO similar debido a que los datos se mueven, no se duplican.

nota

ALTER TABLE APPEND mueve bloques de datos entre la tabla de origen y la tabla de destino. Para mejorar el rendimiento, ALTER TABLE APPEND no compacta el almacenamiento como parte de la operación APPEND. Como resultado, el uso del almacenamiento aumenta temporalmente. Parar reclamar el espacio, ejecute una operación VACUUM.

Las columnas con los mismos nombres también deben tener atributos de columna idénticos. Si la tabla de origen o la tabla de destino contienen columnas que no existen en la otra tabla, use los parámetros IGNOREEXTRA o FILLTARGET para especificar cómo se deben administrar las columnas adicionales.

No se puede agregar una columna de identidad. El comando fallará si ambas tablas incluyen una columna de identidad. Si solo una tabla tiene una columna de identidad, incluya el parámetro FILLTARGET o IGNOREEXTRA. Para obtener más información, consulte Notas de uso acerca de ALTER TABLE APPEND.

Puede anexar una columna GENERATED BY DEFAULT AS IDENTITY. Puede actualizar las columnas definidas como GENERATED BY DEFAULT AS IDENTITY con los valores proporcionados. Para obtener más información, consulte Notas de uso acerca de ALTER TABLE APPEND.

La tabla de destino debe ser una tabla permanente. No obstante, el origen puede ser una tabla permanente o una vista materializada configurada para la ingesta de streaming. Ambos objetos deben usar el mismo estilo de distribución y la misma clave de distribución, si se ha definido una. Si los objetos están ordenados, ambos deben usar el mismo estilo de ordenación y definir las mismas columnas como claves de ordenación.

Un comando ALTER TABLE APPEND se confirma automáticamente apenas se completa la operación. No se puede revertir. No puede ejecutar ALTER TABLE APPEND en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte Aislamiento serializable.

Privilegios necesarios

Según el comando ALTER TABLE APPEND, se requiere uno de los siguientes privilegios:

  • Superusuario

  • Usuarios con el privilegio de sistema ALTER TABLE

  • Usuarios con los privilegios DELETE y SELECT en la tabla de origen y el privilegio INSERT en la tabla de destino

Sintaxis

ALTER TABLE target_table_name APPEND FROM [ source_table_name | source_materialized_view_name ] [ IGNOREEXTRA | FILLTARGET ]

La adición desde una vista materializada solo funciona en el caso en que la vista materializada esté configurada para Ingesta de streaming a una vista materializada.

Parámetros

target_table_name

El nombre de la tabla a la que se agregan las filas. Especifique solo el nombre de la tabla o use el formato schema_name.table_name (nombre-de_esquema.nombre_de_tabla) para usar un esquema específico. La tabla de destino debe ser una tabla permanente existente.

FROM source_table_name

El nombre de la tabla que proporciona las filas que se agregarán. Especifique solo el nombre de la tabla o use el formato schema_name.table_name (nombre-de_esquema.nombre_de_tabla) para usar un esquema específico. La tabla de origen debe ser una tabla permanente existente.

FROM source_materialized_view_name

El nombre de la vista materializada que proporciona las filas que se agregarán. La adición desde una vista materializada solo funciona en el caso en que la vista materializada esté configurada para Ingesta de streaming a una vista materializada. La vista materializada de origen ya debe existir.

IGNOREEXTRA

Una palabra clave que especifica si la tabla de origen incluye columnas que no están presentes en la tabla de destino; los datos de las columnas adicionales deben descartarse. No puede utilizar IGNOREEXTRA con FILLTARGET.

FILLTARGET

Una palabra clave que especifica si la tabla de destino incluye columnas que no están presentes en la tabla de origen; las columnas deben completarse con el valor de la columna DEFAULT, si se definió uno, o con el valor NULL. No puede utilizar IGNOREEXTRA con FILLTARGET.

Notas de uso acerca de ALTER TABLE APPEND

ALTER TABLE APPEND mueve solo las columnas idénticas de la tabla de origen a la tabla de destino. El orden de la columna no es importante.

Si la tabla de origen o la tabla de destino contienen columnas adicionales, utilice FILLTARGET o IGNOREEXTRA según las siguientes reglas:

  • Si la tabla de origen contiene columnas que no existen en la tabla de destino, incluya IGNOREEXTRA. El comando ignora las columnas adicionales de la tabla de origen.

  • Si la tabla de destino contiene columnas que no existen en la tabla de origen, incluya FILLTARGET. El comando rellena las columnas adicionales de la tabla de destino con el valor de columna predeterminado, con el valor IDENTITY, si se definió uno, o con NULL.

  • El comando fallará si ambas tablas, la de origen y la de destino, contienen columnas adicionales. No pueden utilizar ambos parámetros, FILLTARGET e IGNOREEXTRA.

El comando fallará si hay una columna con el mismo nombre, pero con diferentes atributos, en ambas tablas. Las columnas con nombres similares deben tener los siguientes atributos en común:

  • Tipo de datos

  • Tamaño de la columna

  • Codificación de compresión

  • Sin valores nulos

  • Estilo de ordenación

  • Columnas con clave de ordenación

  • Estilo de distribución

  • Columnas con clave de distribución

No se puede agregar una columna de identidad. El comando fallará si ambas tablas, la de origen y la de destino, tienen columnas de identidad. Si solo la tabla de origen tiene una columna de identidad, incluya el parámetro IGNOREEXTRA para ignorar la columna de identidad. Si solo la tabla de destino tiene una columna de identidad, incluya el parámetro FILLTARGET para completar la columna de identidad según la cláusula IDENTITY definida para la tabla. Para obtener más información, consulte DEFAULT.

Puede anexar una columna de identidad predeterminada con la instrucción ALTER TABLE APPEND. Para obtener más información, consulte CREATE TABLE.

Ejemplos de ALTER TABLE APPEND

Supongamos que su organización mantiene una tabla, SALES_MONTHLY, para capturar transacciones de venta actuales. Desea mover datos de la tabla de transacción a la tabla SALES, todos los meses.

Puede utilizar los comandos INSERT INTO y TRUNCATE para llevar a cabo la tarea.

insert into sales (select * from sales_monthly); truncate sales_monthly;

No obstante, puede realizar la misma operación de una manera mucho más eficiente con el comando ALTER TABLE APPEND.

Primero, consulte la tabla de catálogo del sistema PG_TABLE_DEF para verificar que ambas tablas tengan las mismas columnas con atributos de columna idénticos.

select trim(tablename) as table, "column", trim(type) as type, encoding, distkey, sortkey, "notnull" from pg_table_def where tablename like 'sales%'; table | column | type | encoding | distkey | sortkey | notnull -----------+------------+-----------------------------+----------+---------+---------+-------- sales | salesid | integer | lzo | false | 0 | true sales | listid | integer | none | true | 1 | true sales | sellerid | integer | none | false | 2 | true sales | buyerid | integer | lzo | false | 0 | true sales | eventid | integer | mostly16 | false | 0 | true sales | dateid | smallint | lzo | false | 0 | true sales | qtysold | smallint | mostly8 | false | 0 | true sales | pricepaid | numeric(8,2) | delta32k | false | 0 | false sales | commission | numeric(8,2) | delta32k | false | 0 | false sales | saletime | timestamp without time zone | lzo | false | 0 | false salesmonth | salesid | integer | lzo | false | 0 | true salesmonth | listid | integer | none | true | 1 | true salesmonth | sellerid | integer | none | false | 2 | true salesmonth | buyerid | integer | lzo | false | 0 | true salesmonth | eventid | integer | mostly16 | false | 0 | true salesmonth | dateid | smallint | lzo | false | 0 | true salesmonth | qtysold | smallint | mostly8 | false | 0 | true salesmonth | pricepaid | numeric(8,2) | delta32k | false | 0 | false salesmonth | commission | numeric(8,2) | delta32k | false | 0 | false salesmonth | saletime | timestamp without time zone | lzo | false | 0 | false

A continuación, observe el tamaño de cada tabla.

select count(*) from sales_monthly; count ------- 2000 (1 row) select count(*) from sales; count ------- 412,214 (1 row)

Ahora ejecute el siguiente comando ALTER TABLE APPEND.

alter table sales append from sales_monthly;

Observe el tamaño de cada tabla nuevamente. La tabla SALES_MONTHLY ahora tiene 0 filas, y la tabla SALES tiene 2 000 filas más.

select count(*) from sales_monthly; count ------- 0 (1 row) select count(*) from sales; count ------- 414214 (1 row)

Si la tabla de origen contiene más columnas que la tabla de destino, especifique el parámetro IGNOREEXTRA. En el siguiente ejemplo, se usa el parámetro IGNOREEXTRA para ignorar las columnas adicionales de la tabla SALES_LISTING cuando agrega columnas en la tabla SALES.

alter table sales append from sales_listing ignoreextra;

Si la tabla de destino contiene más columnas que la tabla de origen, especifique el parámetro FILLTARGET. En el siguiente ejemplo, se usa el parámetro FILLTARGET para completar columnas en la tabla SALES_REPORT que no existen en la tabla SALES_MONTH.

alter table sales_report append from sales_month filltarget;

A continuación, se muestra un ejemplo de cómo utilizar ALTER TABLE APPEND con una vista materializada como origen.

ALTER TABLE target_tbl APPEND FROM my_streaming_materialized_view;

Los nombres de la tabla y de la vista materializada de este ejemplo son muestras. La adición desde una vista materializada solo funciona en el caso en que la vista materializada esté configurada para Ingesta de streaming a una vista materializada. Mueve todos los registros de la vista materializada de origen a una tabla de destino con el mismo esquema que la vista materializada y deja la vista materializada intacta. Este es el mismo comportamiento que cuando el origen de los datos es una tabla.