ALTER TABLE — cambiar la definición de una tabla
ALTER TABLE [ IF EXISTS ] [ ONLY ]name[ * ]action[, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ]name[ * ] RENAME [ COLUMN ]column_nameTOnew_column_nameALTER TABLE [ IF EXISTS ] [ ONLY ]name[ * ] RENAME CONSTRAINTconstraint_nameTOnew_constraint_nameALTER TABLE [ IF EXISTS ]nameRENAME TOnew_nameALTER TABLE [ IF EXISTS ]nameSET SCHEMAnew_schemaALTER TABLE ALL IN TABLESPACEname[ OWNED BYrole_name[, ... ] ] SET TABLESPACEnew_tablespace[ NOWAIT ] ALTER TABLE [ IF EXISTS ]nameATTACH PARTITIONpartition_name{ FOR VALUESpartition_bound_spec| DEFAULT } ALTER TABLE [ IF EXISTS ]nameDETACH PARTITIONpartition_name[ CONCURRENTLY | FINALIZE ] dondeactiones uno de: ADD [ COLUMN ] [ IF NOT EXISTS ]column_namedata_type[ COLLATEcollation] [column_constraint[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name[ SET DATA ] TYPEdata_type[ COLLATEcollation] [ USINGexpression] ALTER [ COLUMN ]column_nameSET DEFAULTexpressionALTER [ COLUMN ]column_nameDROP DEFAULT ALTER [ COLUMN ]column_name{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_nameSET EXPRESSION AS (expression) ALTER [ COLUMN ]column_nameDROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ]column_nameADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (sequence_options) ] ALTER [ COLUMN ]column_name{ SET GENERATED { ALWAYS | BY DEFAULT } | SETsequence_option| RESTART [ [ WITH ]restart] } [...] ALTER [ COLUMN ]column_nameDROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ]column_nameSET STATISTICS {integer| DEFAULT } ALTER [ COLUMN ]column_nameSET (attribute_option=value[, ... ] ) ALTER [ COLUMN ]column_nameRESET (attribute_option[, ... ] ) ALTER [ COLUMN ]column_nameSET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]column_nameSET COMPRESSIONcompression_methodADDtable_constraint[ NOT VALID ] ADDtable_constraint_using_indexALTER CONSTRAINTconstraint_name[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ] ALTER CONSTRAINTconstraint_name[ INHERIT | NO INHERIT ] VALIDATE CONSTRAINTconstraint_nameDROP CONSTRAINT [ IF EXISTS ]constraint_name[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name| ALL | USER ] ENABLE TRIGGER [trigger_name| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_nameENABLE ALWAYS TRIGGERtrigger_nameDISABLE RULErewrite_rule_nameENABLE RULErewrite_rule_nameENABLE REPLICA RULErewrite_rule_nameENABLE ALWAYS RULErewrite_rule_nameDISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ONindex_nameSET WITHOUT CLUSTER SET WITHOUT OIDS SET ACCESS METHOD {new_access_method| DEFAULT } SET TABLESPACEnew_tablespaceSET { LOGGED | UNLOGGED } SET (storage_parameter[=value] [, ... ] ) RESET (storage_parameter[, ... ] ) INHERITparent_tableNO INHERITparent_tableOFtype_nameNOT OF OWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEXindex_name| FULL | NOTHING } ypartition_bound_speces: IN (partition_bound_expr[, ...] ) | FROM ( {partition_bound_expr| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSnumeric_literal, REMAINDERnumeric_literal) ycolumn_constraintes: [ CONSTRAINTconstraint_name] { NOT NULL [ NO INHERIT ] | NULL | CHECK (expression) [ NO INHERIT ] | DEFAULTdefault_expr| GENERATED ALWAYS AS (generation_expr) [ STORED | VIRTUAL ] | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (sequence_options) ] | UNIQUE [ NULLS [ NOT ] DISTINCT ]index_parameters| PRIMARY KEYindex_parameters| REFERENCESreftable[ (refcolumn) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEreferential_action] [ ON UPDATEreferential_action] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ] ytable_constraintes: [ CONSTRAINTconstraint_name] { CHECK (expression) [ NO INHERIT ] | NOT NULLcolumn_name[ NO INHERIT ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] (column_name[, ... ] [,column_nameWITHOUT OVERLAPS ] )index_parameters| PRIMARY KEY (column_name[, ... ] [,column_nameWITHOUT OVERLAPS ] )index_parameters| EXCLUDE [ USINGindex_method] (exclude_elementWITHoperator[, ... ] )index_parameters[ WHERE (predicate) ] | FOREIGN KEY (column_name[, ... ] [, PERIODcolumn_name] ) REFERENCESreftable[ (refcolumn[, ... ] [, PERIODrefcolumn] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEreferential_action] [ ON UPDATEreferential_action] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ] ytable_constraint_using_indexes: [ CONSTRAINTconstraint_name] { UNIQUE | PRIMARY KEY } USING INDEXindex_name[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] losindex_parametersen las restriccionesUNIQUE,PRIMARY KEYyEXCLUDEson: [ INCLUDE (column_name[, ... ] ) ] [ WITH (storage_parameter[=value] [, ... ] ) ] [ USING INDEX TABLESPACEtablespace_name]exclude_elementen una restricciónEXCLUDEes: {column_name| (expression) } [ COLLATEcollation] [opclass[ (opclass_parameter=value[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]referential_actionen una restricciónFOREIGN KEY/REFERENCESes: { NO ACTION | RESTRICT | CASCADE | SET NULL [ (column_name[, ... ] ) ] | SET DEFAULT [ (column_name[, ... ] ) ] }
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 IDENTITYSET 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_optionRESTART #
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
requieren un bloqueo table_constraintACCESS 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.
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 ... INHERITALTER 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.
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.
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.
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;
Las formas ADD [COLUMN], DROP [COLUMN], DROP IDENTITY, RESTART,
SET DEFAULT, SET DATA TYPE (sin USING), SET GENERATED y
SET cumplen con el estándar SQL.
La forma sequence_optionADD cumple con el estándar SQL cuando se omiten las cláusulas
table_constraintUSING 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.