ALTER TABLE

ALTER TABLE — cambiar la definición de una tabla

Synopsis

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    action [, ... ]
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column_name TO new_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER TABLE [ IF EXISTS ] name
    RENAME TO new_name
ALTER TABLE [ IF EXISTS ] name
    SET SCHEMA new_schema
ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
    SET TABLESPACE new_tablespace [ NOWAIT ]
ALTER TABLE [ IF EXISTS ] name
    ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }
ALTER TABLE [ IF EXISTS ] name
    DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]

donde action es uno de:

    ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
    ALTER [ COLUMN ] column_name SET DEFAULT expression
    ALTER [ COLUMN ] column_name DROP DEFAULT
    ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
    ALTER [ COLUMN ] column_name SET EXPRESSION AS ( expression )
    ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ]
    ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
    ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]
    ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]
    ALTER [ COLUMN ] column_name SET STATISTICS { integer | DEFAULT }
    ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
    ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
    ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
    ALTER [ COLUMN ] column_name SET COMPRESSION compression_method
    ADD table_constraint [ NOT VALID ]
    ADD table_constraint_using_index
    ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
    ALTER CONSTRAINT constraint_name [ INHERIT | NO INHERIT ]
    VALIDATE CONSTRAINT constraint_name
    DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE REPLICA TRIGGER trigger_name
    ENABLE ALWAYS TRIGGER trigger_name
    DISABLE RULE rewrite_rule_name
    ENABLE RULE rewrite_rule_name
    ENABLE REPLICA RULE rewrite_rule_name
    ENABLE ALWAYS RULE rewrite_rule_name
    DISABLE ROW LEVEL SECURITY
    ENABLE ROW LEVEL SECURITY
    FORCE ROW LEVEL SECURITY
    NO FORCE ROW LEVEL SECURITY
    CLUSTER ON index_name
    SET WITHOUT CLUSTER
    SET WITHOUT OIDS
    SET ACCESS METHOD { new_access_method | DEFAULT }
    SET TABLESPACE new_tablespace
    SET { LOGGED | UNLOGGED }
    SET ( storage_parameter [= value] [, ... ] )
    RESET ( storage_parameter [, ... ] )
    INHERIT parent_table
    NO INHERIT parent_table
    OF type_name
    NOT OF
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
    REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }

y partition_bound_spec es:

IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
  TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )

y column_constraint es:

[ CONSTRAINT constraint_name ]
{ NOT NULL [ NO INHERIT ] |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT default_expr |
  GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ] |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
  PRIMARY KEY index_parameters |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]

y table_constraint es:

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
  NOT NULL column_name [ NO INHERIT ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
  PRIMARY KEY ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
  EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
  FOREIGN KEY ( column_name [, ... ] [, PERIOD column_name ] ) REFERENCES reftable [ ( refcolumn [, ... ]  [, PERIOD refcolumn ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]

y table_constraint_using_index es:

    [ CONSTRAINT constraint_name ]
    { UNIQUE | PRIMARY KEY } USING INDEX index_name
    [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

los index_parameters en las restricciones UNIQUE, PRIMARY KEY y EXCLUDE son:

[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]

exclude_element en una restricción EXCLUDE es:

{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

referential_action en una restricción FOREIGN KEY/REFERENCES es:

{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }

Descripción

ALTER TABLE cambia la definición de una tabla existente. Hay varias subformas que se describen a continuación. Ten en cuenta que el nivel de bloqueo requerido puede diferir para cada subforma. Se adquiere un bloqueo ACCESS EXCLUSIVE a menos que se indique explícitamente lo contrario. Cuando se proporcionan múltiples subcomandos, el bloqueo adquirido será el más estricto requerido por cualquiera de los subcomandos.

ADD [ COLUMN ] [ IF NOT EXISTS ] #

Esta forma añade una nueva columna a la tabla, utilizando la misma sintaxis que CREATE TABLE. Si se especifica IF NOT EXISTS y ya existe una columna con este nombre, no se lanza ningún error.

DROP [ COLUMN ] [ IF EXISTS ] #

Esta forma elimina una columna de una tabla. Los índices y las restricciones de tabla que involucren a la columna también se eliminarán automáticamente. Las estadísticas multivariantes que hagan referencia a la columna eliminada también se quitarán si la eliminación de la columna hace que las estadísticas contengan datos de una sola columna. Tendrás que usar CASCADE si algo fuera de la tabla depende de la columna, por ejemplo, referencias de claves foráneas o vistas. Si se especifica IF EXISTS y la columna no existe, no se lanza ningún error. En este caso se emite una advertencia en su lugar.

SET DATA TYPE #

Esta forma cambia el tipo de una columna de una tabla. Los índices y las restricciones sencillas de tabla que involucren a la columna se convertirán automáticamente para usar el nuevo tipo de columna volviendo a analizar la expresión suministrada originalmente. La cláusula opcional COLLATE especifica una colación para la nueva columna; si se omite, la colación por defecto es la del nuevo tipo de columna. La cláusula opcional USING especifica cómo calcular el valor de la nueva columna a partir de la antigua; si se omite, la conversión por defecto es la misma que una conversión de asignación (assignment cast) del tipo de datos antiguo al nuevo. Se debe proporcionar una cláusula USING si no hay una conversión implícita o de asignación del tipo antiguo al nuevo.

Cuando se utiliza esta forma, las estadísticas de la columna se eliminan, por lo que se recomienda ejecutar ANALYZE en la tabla después de realizar el cambio. Para una columna virtual generada, ANALYZE no es necesario porque tales columnas nunca tienen estadísticas.

SET/DROP DEFAULT #

Estas formas establecen o eliminan el valor por defecto para una columna (donde la eliminación es equivalente a establecer el valor por defecto a NULL). El nuevo valor por defecto solo se aplicará en los comandos INSERT o UPDATE posteriores; no hace que cambien las filas que ya están en la tabla.

SET/DROP NOT NULL #

Estas formas cambian si una columna está marcada para permitir valores nulos o para rechazarlos.

SET NOT NULL solo se puede aplicar a una columna siempre que ninguno de los registros de la tabla contenga un valor NULL para esa columna. Normalmente esto se comprueba durante el ALTER TABLE escaneando toda la tabla, a menos que se especifique NOT VALID; sin embargo, si existe una restricción CHECK válida (y no se elimina en el mismo comando) que demuestre que no puede existir ningún NULL, entonces se omite el escaneo de la tabla. Si una columna tiene una restricción de no nulo inválida, SET NOT NULL la valida.

Si esta tabla es una partición, no se puede realizar DROP NOT NULL en una columna si está marcada como NOT NULL en la tabla padre. Para eliminar la restricción NOT NULL de todas las particiones, realiza el DROP NOT NULL en la tabla padre. Incluso si no hay una restricción NOT NULL en el padre, se puede añadir una a las particiones individuales si se desea; es decir, los hijos pueden rechazar nulos incluso si el padre los permite, pero no al revés. También es posible eliminar la restricción NOT NULL de ONLY la tabla padre, lo que no la elimina de los hijos.

SET EXPRESSION AS #

Esta forma reemplaza la expresión de una columna generada. Los datos existentes en una columna generada almacenada (stored) se vuelven a escribir y todos los cambios futuros aplicarán la nueva expresión de generación.

Cuando se utiliza esta forma en una columna generada almacenada, sus estadísticas se eliminan, por lo que se recomienda ejecutar ANALYZE en la tabla después. Para una columna generada virtual, ANALYZE no es necesario porque tales columnas nunca tienen estadísticas.

DROP EXPRESSION [ IF EXISTS ] #

Esta forma convierte una columna generada almacenada en una columna base normal. Se conservan los datos existentes en las columnas, pero los cambios futuros ya no aplicarán la expresión de generación.

Actualmente, esta forma solo es compatible con columnas generadas almacenadas (no con las virtuales).

Si se especifica DROP EXPRESSION IF EXISTS y la columna no es una columna generada, no se lanza ningún error. En este caso se emite una advertencia en su lugar.

ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ] #

Estas formas cambian si una columna es una columna de identidad o cambian el atributo de generación de una columna de identidad existente. Consulta CREATE TABLE para obtener detalles. Al igual que SET DEFAULT, estas formas solo afectan al comportamiento de los comandos INSERT y UPDATE posteriores; no hacen que cambien las filas que ya están en la tabla.

Si se especifica DROP IDENTITY IF EXISTS y la columna no es una columna de identidad, no se lanza ningún error. En este caso se emite una advertencia en su lugar.

SET sequence_option
RESTART #

Estas formas modifican la secuencia subyacente de una columna de identidad existente. sequence_option es una opción admitida por ALTER SEQUENCE, como INCREMENT BY.

SET STATISTICS #

Esta forma establece el objetivo de recopilación de estadísticas por columna para las operaciones ANALYZE posteriores. El objetivo se puede establecer en el rango de 0 a 10000. Establécelo a DEFAULT para volver a usar el objetivo de estadísticas por defecto del sistema (default_statistics_target). (Establecerlo a un valor de -1 es una forma obsoleta de indicar el mismo resultado). Para obtener más información sobre el uso de estadísticas por parte del planificador de consultas de PostgreSQL, consulta Section 14.2.

SET STATISTICS adquiere un bloqueo SHARE UPDATE EXCLUSIVE.

SET ( attribute_option = value [, ... ] )
RESET ( attribute_option [, ... ] ) #

Esta forma establece o restablece opciones por atributo. Actualmente, las únicas opciones por atributo definidas son n_distinct y n_distinct_inherited, las cuales anulan las estimaciones del número de valores distintos realizadas por las operaciones ANALYZE posteriores. n_distinct afecta a las estadísticas de la tabla en sí, mientras que n_distinct_inherited afecta a las estadísticas recopiladas para la tabla más sus hijos de herencia, y a las estadísticas recopiladas para tablas particionadas. Cuando el valor especificado es positivo, el planificador de consultas asumirá que la columna contiene exactamente el número especificado de valores distintos no nulos. También se pueden especificar valores fraccionarios utilizando valores inferiores a 0 y superiores o iguales a -1. Esto le indica al planificador de consultas que estime el número de valores distintos multiplicando el valor absoluto del número especificado por el número estimado de filas en la tabla. Por ejemplo, un valor de -1 implica que todos los valores en la columna son distintos, mientras que un valor de -0.5 implica que cada valor aparece dos veces en promedio. Esto puede ser útil cuando el tamaño de la tabla cambia con el tiempo. Para obtener más información sobre el uso de estadísticas por parte del planificador de consultas de PostgreSQL, consulta Section 14.2.

El cambio de las opciones por atributo adquiere un bloqueo SHARE UPDATE EXCLUSIVE.

SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } #

Esta forma establece el modo de almacenamiento para una columna. Esto controla si esta columna se mantiene en la misma fila (inline) o en una tabla secundaria TOAST, y si los datos deben ser comprimidos o no. PLAIN se debe utilizar para valores de longitud fija como integer y es de tipo inline, no comprimido. MAIN es para datos inline y comprimibles. EXTERNAL es para datos externos y no comprimidos, y EXTENDED es para datos externos y comprimidos. Escribir DEFAULT establece el modo de almacenamiento al modo por defecto para el tipo de datos de la columna. EXTENDED es el valor por defecto para la mayoría de los tipos de datos que admiten un almacenamiento que no sea PLAIN. El uso de EXTERNAL hará que las operaciones de subcadena en valores muy grandes de tipo text y bytea se ejecuten más rápido, a costa de un mayor espacio de almacenamiento. Ten en cuenta que ALTER TABLE ... SET STORAGE no cambia nada en la tabla por sí mismo; solo establece la estrategia que se seguirá durante las futuras actualizaciones de la tabla. Consulta Section 66.2 para obtener más información.

SET COMPRESSION compression_method #

Esta forma establece el método de compresión para una columna, determinando cómo se comprimirán los valores insertados en el futuro (si es que el modo de almacenamiento permite la compresión). Esto no hace que se vuelva a escribir la tabla, por lo que los datos existentes todavía pueden estar comprimidos con otros métodos de compresión. Si la tabla se restaura con pg_restore, entonces todos los valores se vuelven a escribir con el método de compresión configurado. Sin embargo, cuando los datos se insertan desde otra relación (por ejemplo, mediante INSERT ... SELECT), los valores de la tabla origen no se desempaquetan necesariamente de TOAST, por lo que cualquier dato comprimido previamente puede mantener su método de compresión existente, en lugar de ser comprimido nuevamente con el método de compresión de la columna de destino. Los métodos de compresión admitidos son pglz y lz4. (lz4 solo está disponible si se utilizó --with-lz4 al compilar PostgreSQL). Además, compression_method puede ser default, lo cual selecciona el comportamiento por defecto de consultar la configuración default_toast_compression en el momento de la inserción de datos para determinar el método a utilizar.

ADD table_constraint [ NOT VALID ] #

Esta forma añade una nueva restricción a una tabla utilizando la misma sintaxis de restricciones que CREATE TABLE, más la opción NOT VALID, la cual actualmente solo se permite para restricciones de clave foránea, CHECK y no nulo.

Normalmente, esta forma provocará un escaneo de la tabla para verificar que todas las filas existentes en la tabla cumplan con la nueva restricción. Pero si se utiliza la opción NOT VALID, se omite este escaneo que potencialmente puede ser muy largo. La restricción se seguirá aplicando contra las inserciones o actualizaciones posteriores (es decir, fallarán a menos que haya una fila que coincida en la tabla referenciada, en el caso de claves foráneas, o fallarán a menos que la nueva fila coincida con la condición de comprobación especificada). Pero la base de datos no asumirá que la restricción se cumple para todas las filas de la tabla, hasta que se valide utilizando la opción VALIDATE CONSTRAINT. Consulta las Notes a continuación para obtener más información sobre el uso de la opción NOT VALID.

Aunque la mayoría de las formas de ADD table_constraint requieren un bloqueo ACCESS EXCLUSIVE, ADD FOREIGN KEY requiere únicamente un bloqueo SHARE ROW EXCLUSIVE. Ten en cuenta que ADD FOREIGN KEY también adquiere un bloqueo SHARE ROW EXCLUSIVE en la tabla referenciada, además del bloqueo en la tabla en la que se declara la restricción.

Se aplican restricciones adicionales cuando se añaden restricciones de clave primaria o única a tablas particionadas; consulta CREATE TABLE.

ADD table_constraint_using_index #

Esta forma añade una nueva restricción PRIMARY KEY o UNIQUE a una tabla basada en un índice único existente. Todas las columnas del índice se incluirán en la restricción.

El índice no puede tener columnas de expresión ni ser un índice parcial. Además, debe ser un índice b-tree con el orden de clasificación por defecto. Estas restricciones garantizan que el índice sea equivalente a uno que se construiría mediante un comando regular ADD PRIMARY KEY o ADD UNIQUE.

Si se especifica PRIMARY KEY, y las columnas del índice no están marcadas ya como NOT NULL, entonces este comando intentará realizar un ALTER COLUMN SET NOT NULL contra cada una de esas columnas. Eso requiere un escaneo completo de la tabla para verificar que las columnas no contengan nulos. En todos los demás casos, esta es una operación rápida.

Si se proporciona un nombre de restricción, el índice se renombrará para que coincida con el nombre de la restricción. De lo contrario, la restricción se llamará igual que el índice.

Después de ejecutar este comando, el índice es «propiedad» de la restricción, de la misma manera que si el índice se hubiera construido mediante un comando regular ADD PRIMARY KEY o ADD UNIQUE. En particular, la eliminación de la restricción hará que el índice también desaparezca.

Actualmente, esta forma no es compatible con tablas particionadas.

Note

Añadir una restricción utilizando un índice existente puede ser útil en situaciones en las que se necesita añadir una nueva restricción sin bloquear las actualizaciones de la tabla durante mucho tiempo. Para hacer eso, crea el índice utilizando CREATE UNIQUE INDEX CONCURRENTLY, y luego conviértelo en una restricción utilizando esta sintaxis. Consulta el ejemplo a continuación.

ALTER CONSTRAINT #

Esta forma altera los atributos de una restricción que fue creada previamente. Actualmente, solo las restricciones de clave foránea pueden ser alteradas de esta manera, pero consulta a continuación.

ALTER CONSTRAINT ... INHERIT
ALTER CONSTRAINT ... NO INHERIT #

Estas formas modifican una restricción heredable para que deje de ser heredable, o viceversa. Actualmente, solo las restricciones no nulas pueden ser alteradas de esta manera. Además de cambiar el estado de heredabilidad de la restricción, en el caso en que una restricción no heredable se marque como heredable, si la tabla tiene hijos, se les añadirá una restricción equivalente. Si se marca una restricción heredable como no heredable en una tabla con hijos, entonces la restricción correspondiente en los hijos se marcará como que ya no es heredada, pero no se eliminará.

VALIDATE CONSTRAINT #

Esta forma valida una restricción de clave foránea, de comprobación (check) o no nula que fue creada previamente como NOT VALID, escaneando la tabla para asegurarse de que no haya filas que no cumplan con la restricción. Si la restricción se estableció como NOT ENFORCED, se lanza un error. No ocurre nada si la restricción ya está marcada como válida. (Consulta las Notes a continuación para una explicación de la utilidad de este comando).

Este comando adquiere un bloqueo SHARE UPDATE EXCLUSIVE.

DROP CONSTRAINT [ IF EXISTS ] #

Esta forma elimina la restricción especificada de una tabla, junto con cualquier índice subyacente a la restricción. Si se especifica IF EXISTS y la restricción no existe, no se lanza ningún error. En este caso se emite una advertencia en su lugar.

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER #

Estas formas configuran el disparo (firing) de los disparadores (triggers) pertenecientes a la tabla. Un disparador desactivado sigue siendo conocido por el sistema, pero no se ejecuta cuando ocurre su evento de disparo. (Para un disparador diferido, el estado de activación se comprueba cuando ocurre el evento, no cuando se ejecuta realmente la función del disparador). Se puede desactivar o activar un disparador único especificado por su nombre, o todos los disparadores de la tabla, o solo los disparadores de usuario (esta opción excluye los disparadores de restricción generados internamente, como aquellos que se utilizan para implementar restricciones de clave foránea o restricciones de unicidad y exclusión diferibles). Desactivar o activar disparadores de restricción generados internamente requiere privilegios de superusuario; debe hacerse con precaución ya que, por supuesto, la integridad de la restricción no se puede garantizar si los disparadores no se ejecutan.

El mecanismo de disparo de disparadores también se ve afectado por la variable de configuración session_replication_role. Los disparadores simplemente activados (por defecto) se dispararán cuando el rol de replicación sea origin (por defecto) o local. Los disparadores configurados como ENABLE REPLICA solo se dispararán si la sesión se encuentra en modo replica, y los disparadores configurados como ENABLE ALWAYS se dispararán independientemente del rol de replicación actual.

El efecto de este mecanismo es que en la configuración por defecto, los disparadores no se disparan en las réplicas. Esto es útil porque si se utiliza un disparador en el origen para propagar datos entre tablas, entonces el sistema de replicación también replicará los datos propagados; por lo que el disparador no debería dispararse una segunda vez en la réplica, ya que eso conduciría a una duplicación. Sin embargo, si se utiliza un disparador para otro propósito, como la creación de alertas externas, entonces podría ser apropiado establecerlo como ENABLE ALWAYS para que también se dispare en las réplicas.

Cuando este comando se aplica a una tabla particionada, los estados de los disparadores clonados correspondientes en las particiones también se actualizan, a menos que se especifique ONLY.

Este comando adquiere un bloqueo SHARE ROW EXCLUSIVE.

DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE #

Estas formas configuran la aplicación de las reglas de reescritura pertenecientes a la tabla. Una regla desactivada sigue siendo conocida por el sistema, pero no se aplica durante la reescritura de consultas. La semántica es la misma que para los disparadores activados/desactivados. Esta configuración se ignora para las reglas ON SELECT, las cuales siempre se aplican para mantener el funcionamiento de las vistas, incluso si la sesión actual se encuentra en un rol de replicación que no es el por defecto.

El mecanismo de disparo de reglas también se ve afectado por la variable de configuración session_replication_role, de forma análoga a los disparadores descritos anteriormente.

DISABLE/ENABLE ROW LEVEL SECURITY #

Estas formas controlan la aplicación de las políticas de seguridad a nivel de fila pertenecientes a la tabla. Si se activa y no existen políticas para la tabla, se aplica una política de denegación por defecto (default-deny). Ten en cuenta que las políticas pueden existir para una tabla incluso si la seguridad a nivel de fila está desactivada. En este caso, las políticas no se aplicarán y serán ignoradas. Consulta también CREATE POLICY.

NO FORCE/FORCE ROW LEVEL SECURITY #

Estas formas controlan la aplicación de las políticas de seguridad a nivel de fila pertenecientes a la tabla cuando el usuario es el propietario de la tabla. Si se activa, las políticas de seguridad a nivel de fila se aplicarán cuando el usuario sea el propietario de la tabla. Si se desactiva (por defecto), entonces la seguridad a nivel de fila no se aplicará cuando el usuario sea el propietario de la tabla. Consulta también CREATE POLICY.

CLUSTER ON #

Esta forma selecciona el índice por defecto para futuras operaciones CLUSTER. No vuelve a agrupar la tabla realmente.

El cambio de las opciones de agrupación adquiere un bloqueo SHARE UPDATE EXCLUSIVE.

SET WITHOUT CLUSTER #

Esta forma elimina la especificación del índice CLUSTER utilizado más recientemente de la tabla. Esto afecta a las futuras operaciones de agrupación que no especifiquen un índice.

El cambio de las opciones de agrupación adquiere un bloqueo SHARE UPDATE EXCLUSIVE.

SET WITHOUT OIDS #

Sintaxis de compatibilidad hacia atrás para eliminar la columna de sistema oid. Dado que las columnas de sistema oid ya no se pueden añadir, esto nunca tiene ningún efecto.

SET ACCESS METHOD #

Esta forma cambia el método de acceso de la tabla reescribiéndola utilizando el método de acceso indicado; especificar DEFAULT selecciona el método de acceso establecido como el parámetro de configuración default_table_access_method. Consulta Chapter 62 para obtener más información.

Cuando se aplica a una tabla particionada, no hay datos que reescribir, pero las particiones creadas posteriormente usarán por defecto el método de acceso indicado, a menos que se anule mediante una cláusula USING. Especificar DEFAULT elimina un valor anterior, haciendo que las particiones futuras usen por defecto default_table_access_method.

SET TABLESPACE #

Esta forma cambia el tablespace de la tabla al tablespace especificado y mueve los archivos de datos asociados con la tabla al nuevo tablespace. Los índices de la tabla, si los hay, no se mueven; pero se pueden mover por separado con comandos adicionales SET TABLESPACE. Cuando se aplica a una tabla particionada, no se mueve nada, pero cualquier partición creada posteriormente con CREATE TABLE PARTITION OF utilizará ese tablespace, a menos que se anule mediante una cláusula TABLESPACE.

Todas las tablas de la base de datos actual que estén en un tablespace se pueden mover utilizando la forma ALL IN TABLESPACE, la cual bloqueará primero todas las tablas a mover y luego moverá cada una de ellas. Esta forma también admite OWNED BY, que solo moverá las tablas propiedad de los roles especificados. Si se especifica la opción NOWAIT, entonces el comando fallará si no puede adquirir inmediatamente todos los bloqueos requeridos. Ten en cuenta que los catálogos del sistema no se mueven con este comando; utiliza ALTER DATABASE o invocaciones explícitas de ALTER TABLE en su lugar si se desea. Las relaciones de information_schema no se consideran parte de los catálogos del sistema y se moverán. Consulta también CREATE TABLESPACE.

SET { LOGGED | UNLOGGED } #

Esta forma cambia la tabla de unlogged (no registrada) a logged (registrada) o viceversa (consulta UNLOGGED). No se puede aplicar a una tabla temporal.

Esto también cambia la persistencia de cualquier secuencia vinculada a la tabla (para columnas de identidad o serial). Sin embargo, también es posible cambiar la persistencia de dichas secuencias por separado.

Esta forma no es compatible con tablas particionadas.

SET ( storage_parameter [= value] [, ... ] ) #

Esta forma cambia uno o más parámetros de almacenamiento para la tabla. Consulta Parámetros de almacenamiento en la documentación de CREATE TABLE para obtener detalles sobre los parámetros disponibles. Ten en cuenta que el contenido de la tabla no se modificará inmediatamente con este comando; dependiendo del parámetro, puede que necesites reescribir la tabla para obtener los efectos deseados. Eso se puede hacer con VACUUM FULL, CLUSTER o una de las formas de ALTER TABLE que fuerza una reescritura de la tabla. Para los parámetros relacionados con el planificador, los cambios surtirán efecto a partir de la próxima vez que se bloquee la tabla, por lo que las consultas en ejecución actualmente no se verán afectadas.

Se tomará un bloqueo SHARE UPDATE EXCLUSIVE para los parámetros de almacenamiento fillfactor, toast y autovacuum, así como para el parámetro del planificador parallel_workers.

RESET ( storage_parameter [, ... ] ) #

Esta forma restablece uno o más parámetros de almacenamiento a sus valores por defecto. Al igual que con SET, puede ser necesaria una reescritura de la tabla para actualizar la tabla por completo.

INHERIT parent_table #

Esta forma añade la tabla de destino como un nuevo hijo de la tabla padre especificada. Posteriormente, las consultas contra el padre incluirán los registros de la tabla de destino. Para ser añadida como hijo, la tabla de destino debe contener ya todas las mismas columnas que el padre (también podría tener columnas adicionales). Las columnas deben tener tipos de datos coincidentes.

Además, todas las restricciones CHECK y NOT NULL del padre también deben existir en el hijo, excepto aquellas marcadas como no heredables (es decir, creadas con ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT), las cuales se ignoran. Todas las restricciones de la tabla hijo que coincidan no deben estar marcadas como no heredables. Actualmente, las restricciones UNIQUE, PRIMARY KEY y FOREIGN KEY no se tienen en cuenta, pero esto podría cambiar en el futuro.

NO INHERIT parent_table #

Esta forma elimina la tabla de destino de la lista de hijos de la tabla padre especificada. Las consultas contra la tabla padre ya no incluirán registros extraídos de la tabla de destino.

OF type_name #

Esta forma vincula la tabla a un tipo compuesto como si CREATE TABLE OF la hubiera formado. La lista de nombres y tipos de columnas de la tabla debe coincidir exactamente con la del tipo compuesto. La tabla no debe heredar de ninguna otra tabla. Estas restricciones garantizan que CREATE TABLE OF permitiría una definición de tabla equivalente.

NOT OF #

Esta forma disocia una tabla con tipo (typed table) de su tipo.

OWNER TO #

Esta forma cambia el propietario de la tabla, secuencia, vista, vista materializada o tabla foránea al usuario especificado.

REPLICA IDENTITY #

Esta forma cambia la información que se escribe en el registro de escritura anticipada (WAL) para identificar las filas que se actualizan o eliminan. En la mayoría de los casos, el valor antiguo de cada columna solo se registra si difiere del valor nuevo; sin embargo, si el valor antiguo se almacena externamente, siempre se registra independientemente de si cambió. Esta opción no tiene efecto excepto cuando se está utilizando la replicación lógica.

DEFAULT #

Registra los valores antiguos de las columnas de la clave primaria. Este es el valor por defecto para las tablas que no son del sistema. Cuando no hay una clave primaria, el comportamiento es el mismo que NOTHING.

USING INDEX index_name #

Registra los valores antiguos de las columnas cubiertas por el índice nombrado, el cual debe ser único, no parcial, no diferible, y debe incluir únicamente columnas marcadas como NOT NULL. Si este índice se elimina, el comportamiento es el mismo que NOTHING.

FULL #

Registra los valores antiguos de todas las columnas de la fila.

NOTHING #

No registra ninguna información sobre la fila antigua. Este es el valor por defecto para las tablas del sistema.

RENAME #

Las formas RENAME cambian el nombre de una tabla (o de un índice, secuencia, vista, vista materializada o tabla foránea), el nombre de una columna individual en una tabla, o el nombre de una restricción de la tabla. Al renombrar una restricción que tiene un índice subyacente, el índice también se renombra. No tiene ningún efecto sobre los datos almacenados.

SET SCHEMA #

Esta forma mueve la tabla a otro esquema. Los índices asociados, restricciones y secuencias propiedad de las columnas de la tabla también se mueven.

ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT } #

Esta forma asocia una tabla existente (que a su vez podría estar particionada) como una partición de la tabla de destino. La tabla se puede asociar como una partición para valores específicos mediante FOR VALUES o como una partición por defecto mediante DEFAULT. Para cada índice en la tabla de destino, se creará uno correspondiente en la tabla asociada; o, si ya existe un índice equivalente, se asociará al índice de la tabla de destino, como si se hubiera ejecutado ALTER INDEX ATTACH PARTITION. Ten en cuenta que si la tabla existente es una tabla foránea, actualmente no se permite asociar la tabla como una partición de la tabla de destino si existen índices UNIQUE en la tabla de destino. (Consulta también CREATE FOREIGN TABLE). Para cada disparador (trigger) a nivel de fila definido por el usuario que exista en la tabla de destino, se crea uno correspondiente en la tabla asociada.

Una partición que utiliza FOR VALUES utiliza la misma sintaxis para partition_bound_spec que CREATE TABLE. La especificación de límites de partición debe corresponder a la estrategia de particionamiento y a la clave de partición de la tabla de destino. La tabla a asociar debe tener exactamente las mismas columnas que la tabla de destino y ninguna más; además, los tipos de columnas también deben coincidir. También debe tener todas las restricciones NOT NULL y CHECK de la tabla de destino, no marcadas como NO INHERIT. Actualmente, las restricciones FOREIGN KEY no se tienen en cuenta. Las restricciones UNIQUE y PRIMARY KEY de la tabla padre se crearán en la partición, si no existen ya.

Si la nueva partición es una tabla normal, se realiza un escaneo completo de la tabla para verificar que las filas existentes en la tabla no violen la restricción de partición. Es posible evitar este escaneo añadiendo una restricción CHECK válida a la tabla que permita únicamente filas que cumplan con la restricción de partición deseada antes de ejecutar este comando. La restricción CHECK se utilizará para determinar que no es necesario escanear la tabla para validar la restricción de partición. Sin embargo, esto no funciona si alguna de las claves de partición es una expresión y la partición no acepta valores NULL. Si estás asociando una partición por lista que no aceptará valores NULL, añade también una restricción NOT NULL a la columna de la clave de partición, a menos que sea una expresión.

Si la nueva partición es una tabla foránea, no se hace nada para verificar que todas las filas de la tabla foránea cumplan con la restricción de partición. (Consulta la discusión en CREATE FOREIGN TABLE sobre las restricciones en la tabla foránea).

Cuando una tabla tiene una partición por defecto, la definición de una nueva partición cambia la restricción de partición para la partición por defecto. La partición por defecto no puede contener ninguna fila que necesite ser movida a la nueva partición, y será escaneada para verificar que no haya ninguna presente. Este escaneo, al igual que el escaneo de la nueva partición, se puede evitar si se encuentra presente una restricción CHECK adecuada. Al igual que el escaneo de la nueva partición, siempre se omite cuando la partición por defecto es una tabla foránea.

Asociar una partición adquiere un bloqueo SHARE UPDATE EXCLUSIVE en la tabla padre, además de los bloqueos ACCESS EXCLUSIVE en la tabla que se está asociando y en la partición por defecto (si la hay).

También se deben mantener bloqueos adicionales en todas las subparticiones si la tabla que se está asociando es a su vez una tabla particionada. Del mismo modo, si la partición por defecto es a su vez una tabla particionada. El bloqueo de las subparticiones se puede evitar añadiendo una restricción CHECK como se describe en Section 5.12.2.2.

DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ] #

Esta forma desasocia la partición especificada de la tabla de destino. La partición desasociada sigue existiendo como una tabla independiente, pero ya no tiene ningún vínculo con la tabla de la que fue desasociada. Los índices que estuvieran asociados a los índices de la tabla de destino se desasocian. Los disparadores que se crearon como clones de aquellos en la tabla de destino se eliminan. Se obtiene un bloqueo SHARE en cualquier tabla que haga referencia a esta tabla particionada en restricciones de clave foránea.

Si se especifica CONCURRENTLY, se ejecuta utilizando un nivel de bloqueo reducido para evitar bloquear a otras sesiones que pudieran estar accediendo a la tabla particionada. En este modo, se utilizan internamente dos transacciones. Durante la primera transacción, se toma un bloqueo SHARE UPDATE EXCLUSIVE tanto en la tabla padre como en la partición, y la partición se marca como en proceso de desasociación; en ese momento, la transacción se confirma y se espera a que terminen todas las demás transacciones que utilizan la tabla particionada. Una vez completadas todas esas transacciones, la segunda transacción adquiere SHARE UPDATE EXCLUSIVE en la tabla particionada y ACCESS EXCLUSIVE en la partición, y el proceso de desasociación finaliza. Se añade a la partición una restricción CHECK que duplica la restricción de partición. CONCURRENTLY no se puede ejecutar en un bloque de transacción y no se permite si la tabla particionada contiene una partición por defecto.

Si se especifica FINALIZE, se completa una invocación anterior de DETACH CONCURRENTLY que fue cancelada o interrumpida. A lo sumo, una partición de una tabla particionada puede estar pendiente de desasociación a la vez.

Todas las formas de ALTER TABLE que actúan sobre una sola tabla, excepto RENAME, SET SCHEMA, ATTACH PARTITION y DETACH PARTITION se pueden combinar en una lista de múltiples alteraciones a aplicar conjuntamente. Por ejemplo, es posible añadir varias columnas y/o alterar el tipo de varias columnas en un solo comando. Esto es particularmente útil con tablas grandes, ya que solo es necesario realizar una pasada por la tabla.

Debes ser el propietario de la tabla para utilizar ALTER TABLE. Para cambiar el esquema o tablespace de una tabla, también debes tener el privilegio CREATE en el nuevo esquema o tablespace. Para añadir la tabla como un nuevo hijo de una tabla padre, también debes ser el propietario de la tabla padre. Además, para asociar una tabla como una nueva partición de la tabla, debes ser el propietario de la tabla que se está asociando. Para cambiar el propietario, debes poder hacer SET ROLE al nuevo rol propietario, y ese rol debe tener el privilegio CREATE en el esquema de la tabla. (Estas restricciones garantizan que cambiar el propietario no haga nada que no pudieras hacer eliminando y volviendo a crear la tabla. Sin embargo, un superusuario puede cambiar el propietario de cualquier tabla de todos modos). Para añadir una columna o alterar un tipo de columna o utilizar la cláusula OF, también debes tener el privilegio USAGE en el tipo de datos.

Parámetros

IF EXISTS #

No lanza ningún error si la tabla no existe. En este caso se emite una advertencia.

name #

El nombre (opcionalmente calificado por esquema) de una tabla existente a alterar. Si se especifica ONLY antes del nombre de la tabla, solo se altera esa tabla. Si no se especifica ONLY, se alteran la tabla y todas sus tablas descendientes (si las hay). Opcionalmente, se puede especificar * después del nombre de la tabla para indicar explícitamente que se incluyen las tablas descendientes.

column_name #

El nombre de una columna nueva o existente.

new_column_name #

El nuevo nombre para una columna existente.

new_name #

El nuevo nombre para la tabla.

data_type #

El tipo de datos de la nueva columna, o el nuevo tipo de datos para una columna existente.

table_constraint #

La nueva restricción de tabla para la tabla.

constraint_name #

El nombre de una restricción nueva o existente.

CASCADE #

Elimina automáticamente los objetos que dependen de la columna o restricción eliminada (por ejemplo, vistas que hacen referencia a la columna) y, a su vez, todos los objetos que dependen de esos objetos (consulta Section 5.15).

RESTRICT #

Rechaza eliminar la columna o restricción si existen objetos dependientes. Este es el comportamiento por defecto.

trigger_name #

El nombre de un disparador único a desactivar o activar.

ALL #

Desactiva o activa todos los disparadores pertenecientes a la tabla. (Esto requiere privilegios de superusuario si alguno de los disparadores es un disparador de restricción generado internamente, como aquellos que se utilizan para implementar restricciones de clave foránea o restricciones de unicidad y exclusión diferibles).

USER #

Desactiva o activa todos los disparadores pertenecientes a la tabla excepto los disparadores de restricción generados internamente, como aquellos que se utilizan para implementar restricciones de clave foránea o restricciones de unicidad y exclusión diferibles.

index_name #

El nombre de un índice existente.

storage_parameter #

El nombre de un parámetro de almacenamiento de la tabla.

value #

El nuevo valor para un parámetro de almacenamiento de la tabla. Esto puede ser un número o una palabra dependiendo del parámetro.

parent_table #

Una tabla padre a asociar o desasociar de esta tabla.

new_owner #

El nombre de usuario del nuevo propietario de la tabla.

new_access_method #

El nombre del método de acceso al que se convertirá la tabla.

new_tablespace #

El nombre del tablespace al que se moverá la tabla.

new_schema #

El nombre del esquema al que se moverá la tabla.

partition_name #

El nombre de la tabla a asociar como una nueva partición o a desasociar de esta tabla.

partition_bound_spec #

La especificación de límites de partición para una nueva partición. Consulta CREATE TABLE para obtener más detalles sobre la sintaxis de la misma.

Notas

La palabra clave COLUMN es ruido y se puede omitir.

Cuando se añade una columna con ADD COLUMN y se especifica un DEFAULT no volátil, el valor por defecto se evalúa en el momento de la instrucción y el resultado se almacena en los metadatos de la tabla, de donde se devolverá cuando se acceda a las filas existentes. El valor solo se aplicará cuando se vuelva a escribir la tabla, lo que hace que el ALTER TABLE sea muy rápido incluso en tablas grandes. Si no se especifican restricciones de columna, se utiliza NULL como valor DEFAULT. En ninguno de los dos casos es necesaria una reescritura de la tabla.

Añadir una columna con un DEFAULT volátil (por ejemplo, clock_timestamp()), una columna generada almacenada, una columna de identidad, o una columna con un tipo de datos de dominio que tenga restricciones provocará la reescritura de toda la tabla y sus índices. Añadir una columna generada virtual nunca requiere una reescritura.

El cambio de tipo de una columna existente provocará normalmente la reescritura de toda la tabla y sus índices. Como excepción, al cambiar el tipo de una columna existente, si la cláusula USING no cambia el contenido de la columna y el tipo antiguo es coercible binariamente al nuevo tipo o es un dominio sin restricciones sobre el nuevo tipo, no es necesaria una reescritura de la tabla. Sin embargo, los índices se seguirán reconstruyendo a menos que el sistema pueda verificar que el nuevo índice sería lógicamente equivalente al existente. Por ejemplo, si se ha cambiado la colación de una columna, se requiere una reconstrucción del índice porque el nuevo orden de clasificación podría ser diferente. Sin embargo, en ausencia de un cambio de colación, una columna se puede cambiar de text a varchar (o viceversa) sin necesidad de reconstruir los índices porque estos tipos de datos se clasifican de forma idéntica.

Las reconstrucciones de tablas y/o índices pueden requerir una cantidad significativa de tiempo para una tabla grande, y requerirán temporalmente hasta el doble de espacio en disco.

Añadir una restricción CHECK o NOT NULL requiere escanear la tabla para verificar que las filas existentes cumplan con la restricción, pero no requiere una reescritura de la tabla. Si se añade una restricción CHECK como NOT ENFORCED, no se realizará ninguna verificación.

Del mismo modo, al asociar una nueva partición, esta puede ser escaneada para verificar que las filas existentes cumplan con la restricción de partición.

La razón principal para proporcionar la opción de especificar múltiples cambios en un solo ALTER TABLE es que de ese modo se pueden combinar múltiples escaneos o reescrituras de la tabla en una sola pasada sobre la misma.

Escanear una tabla grande para verificar nuevas restricciones de clave foránea, de comprobación o de no nulo puede llevar mucho tiempo, y otras actualizaciones de la tabla quedan bloqueadas hasta que se confirma el comando ALTER TABLE ADD CONSTRAINT. El propósito principal de la opción de restricción NOT VALID es reducir el impacto de añadir una restricción en las actualizaciones concurrentes. Con NOT VALID, el comando ADD CONSTRAINT no escanea la tabla y se puede confirmar inmediatamente. Después de eso, se puede emitir un comando VALIDATE CONSTRAINT para verificar que las filas existentes cumplan con la restricción. El paso de validación no necesita bloquear las actualizaciones concurrentes, ya que sabe que otras transacciones estarán aplicando la restricción para las filas que inserten o actualicen; solo es necesario comprobar las filas preexistentes. Por lo tanto, la validación adquiere únicamente un bloqueo SHARE UPDATE EXCLUSIVE en la tabla que se está alterando. (Si la restricción es una clave foránea, también se requiere un bloqueo ROW SHARE en la tabla referenciada por la restricción). Además de mejorar la concurrencia, puede ser útil usar NOT VALID y VALIDATE CONSTRAINT en casos donde se sabe que la tabla contiene violaciones preexistentes. Una vez colocada la restricción, no se pueden insertar nuevas violaciones, y los problemas existentes se pueden corregir con calma hasta que VALIDATE CONSTRAINT finalmente tenga éxito.

La forma DROP COLUMN no elimina físicamente la columna, sino que simplemente la hace invisible para las operaciones SQL. Las operaciones de inserción y actualización posteriores en la tabla almacenarán un valor nulo para la columna. Por lo tanto, la eliminación de una columna es rápida, pero no reducirá inmediatamente el tamaño en disco de la tabla, ya que el espacio ocupado por la columna eliminada no se reclama. El espacio se reclamará con el tiempo a medida que se actualicen las filas existentes.

Para forzar la reclamación inmediata del espacio ocupado por una columna eliminada, puedes ejecutar una de las formas de ALTER TABLE que realiza una reescritura de toda la tabla. Esto da como resultado la reconstrucción de cada fila con la columna eliminada reemplazada por un valor nulo.

Las formas de reescritura de ALTER TABLE no son seguras bajo MVCC. Después de una reescritura de tabla, la tabla aparecerá vacía para las transacciones concurrentes si están utilizando una instantánea (snapshot) tomada antes de que ocurriera la reescritura. Consulta la Section 13.6 para obtener más detalles.

La opción USING de SET DATA TYPE puede especificar en realidad cualquier expresión que involucre los valores antiguos de la fila; es decir, puede hacer referencia a otras columnas además de la que se está convirtiendo. Esto permite realizar conversiones muy generales con la sintaxis de SET DATA TYPE. Debido a esta flexibilidad, la expresión USING no se aplica al valor por defecto de la columna (si lo hay); el resultado podría no ser una expresión constante como se requiere para un valor por defecto. Esto significa que cuando no hay una conversión implícita o de asignación del tipo antiguo al nuevo, SET DATA TYPE podría fallar al convertir el valor por defecto incluso aunque se suministre una cláusula USING. En tales casos, elimina el valor por defecto con DROP DEFAULT, realiza el ALTER TYPE y luego usa SET DEFAULT para añadir un nuevo valor por defecto adecuado. Se aplican consideraciones similares a los índices y restricciones que involucren a la columna.

Si una tabla tiene tablas descendientes, no está permitido añadir, renombrar o cambiar el tipo de una columna en la tabla padre sin hacer lo mismo en los descendientes. Esto garantiza que los descendientes siempre tengan columnas coincidentes con el padre. Del mismo modo, una restricción CHECK no se puede renombrar en el padre sin renombrarla también en todos los descendientes, para que las restricciones CHECK también coincidan entre el padre y sus descendientes. (Sin embargo, esa restricción no se aplica a las restricciones basadas en índices). Además, debido a que la selección de la tabla padre también selecciona de sus descendientes, una restricción en el padre no se puede marcar como válida a menos que también se marque como válida para esos descendientes. En todos estos casos, se rechazará ALTER TABLE ONLY.

Una operación recursiva DROP COLUMN eliminará la columna de una tabla descendiente solo si el descendiente no hereda esa columna de ningún otro padre y nunca tuvo una definición independiente de la columna. Un DROP COLUMN no recursivo (es decir, ALTER TABLE ONLY ... DROP COLUMN) nunca elimina las columnas descendientes, sino que las marca como definidas de forma independiente en lugar de heredadas. Un comando DROP COLUMN no recursivo fallará para una tabla particionada, porque todas las particiones de una tabla deben tener las mismas columnas que la raíz de particionamiento.

Las acciones para columnas de identidad (ADD GENERATED, SET etc., DROP IDENTITY), así como las acciones CLUSTER, OWNER y TABLESPACE nunca se aplican recursivamente a las tablas descendientes; es decir, siempre actúan como si se hubiera especificado ONLY. Las acciones que afectan a los estados de los disparadores se aplican recursivamente a las particiones de las tablas particionadas (a menos que se especifique ONLY), pero nunca a los descendientes de herencia tradicional. Añadir una restricción se aplica recursivamente solo para las restricciones CHECK que no estén marcadas como NO INHERIT.

No está permitido cambiar ninguna parte de una tabla de catálogo del sistema.

Consulta CREATE TABLE para obtener una descripción más detallada de los parámetros válidos. La Chapter 5 tiene información adicional sobre la herencia.

Ejemplos

Para añadir una columna de tipo varchar a una tabla:

ALTER TABLE distributors ADD COLUMN address varchar(30);

Eso hará que todas las filas existentes en la tabla se rellenen con valores nulos para la nueva columna.

Para añadir una columna con un valor por defecto no nulo:

ALTER TABLE measurements
  ADD COLUMN mtime timestamp with time zone DEFAULT now();

Las filas existentes se rellenarán con la hora actual como valor de la nueva columna, y luego las nuevas filas recibirán la hora de su inserción.

Para añadir una columna y rellenarla con un valor diferente del valor por defecto que se utilizará más adelante:

ALTER TABLE transactions
  ADD COLUMN status varchar(30) DEFAULT 'old',
  ALTER COLUMN status SET default 'current';

Las filas existentes se rellenarán con old, pero el valor por defecto para los comandos posteriores será current. Los efectos son los mismos que si los dos subcomandos se hubieran emitido en comandos ALTER TABLE separados.

Para eliminar una columna de una tabla:

ALTER TABLE distributors DROP COLUMN address RESTRICT;

Para cambiar los tipos de dos columnas existentes en una sola operación:

ALTER TABLE distributors
    ALTER COLUMN address TYPE varchar(80),
    ALTER COLUMN name TYPE varchar(100);

Para cambiar una columna de enteros que contiene marcas de tiempo Unix a timestamp with time zone mediante una cláusula USING:

ALTER TABLE foo
    ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';

Lo mismo, cuando la columna tiene una expresión por defecto que no se convertirá automáticamente al nuevo tipo de datos:

ALTER TABLE foo
    ALTER COLUMN foo_timestamp DROP DEFAULT,
    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
    ALTER COLUMN foo_timestamp SET DEFAULT now();

Para renombrar una columna existente:

ALTER TABLE distributors RENAME COLUMN address TO city;

Para renombrar una tabla existente:

ALTER TABLE distributors RENAME TO suppliers;

Para renombrar una restricción existente:

ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;

Para añadir una restricción de no nulo a una columna:

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;

Para eliminar una restricción de no nulo de una columna:

ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;

Para añadir una restricción de comprobación (check) a una tabla y a todos sus hijos:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);

Para añadir una restricción de comprobación únicamente a una tabla y no a sus hijos:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;

(La restricción de comprobación tampoco será heredada por los futuros hijos).

Para eliminar una restricción de comprobación de una tabla y de todos sus hijos:

ALTER TABLE distributors DROP CONSTRAINT zipchk;

Para eliminar una restricción de comprobación únicamente de una tabla:

ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;

(La restricción de comprobación permanece activa para cualquier tabla hija).

Para añadir una restricción de clave foránea a una tabla:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);

Para añadir una restricción de clave foránea a una tabla con el menor impacto en otros trabajos:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID;
ALTER TABLE distributors VALIDATE CONSTRAINT distfk;

Para añadir una restricción de unicidad (multicolumn) a una tabla:

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

Para añadir una restricción de clave primaria con nombre automático a una tabla, teniendo en cuenta que una tabla solo puede tener una clave primaria:

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);

Para mover una tabla a un tablespace diferente:

ALTER TABLE distributors SET TABLESPACE fasttablespace;

Para mover una tabla a un esquema diferente:

ALTER TABLE distributors SET SCHEMA yourschema;

Para volver a crear una restricción de clave primaria, sin bloquear las actualizaciones mientras se reconstruye el índice:

CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
    ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;

Para asociar una partición a una tabla particionada por rango:

ALTER TABLE measurement
    ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

Para asociar una partición a una tabla particionada por lista:

ALTER TABLE cities
    ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');

Para asociar una partición a una tabla particionada por hash:

ALTER TABLE orders
    ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Para asociar una partición por defecto a una tabla particionada:

ALTER TABLE cities
    ATTACH PARTITION cities_partdef DEFAULT;

Para desasociar una partición de una tabla particionada:

ALTER TABLE measurement
    DETACH PARTITION measurement_y2015m12;

Compatibilidad

Las formas ADD [COLUMN], DROP [COLUMN], DROP IDENTITY, RESTART, SET DEFAULT, SET DATA TYPE (sin USING), SET GENERATED y SET sequence_option cumplen con el estándar SQL. La forma ADD table_constraint cumple con el estándar SQL cuando se omiten las cláusulas USING INDEX y NOT VALID y el tipo de restricción es uno de CHECK, UNIQUE, PRIMARY KEY o REFERENCES. Las otras formas son extensiones de PostgreSQL del estándar SQL. Además, la capacidad de especificar más de una manipulación en un solo comando ALTER TABLE es una extensión.

ALTER TABLE DROP COLUMN se puede utilizar para eliminar la única columna de una tabla, dejando una tabla con cero columnas. Esta es una extensión de SQL, el cual no permite tablas con cero columnas.

Consulte también

CREATE TABLE