ALTER TYPE

ALTER TYPE — cambiar la definición de un tipo

Synopsis

ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
ALTER TYPE name SET ( property = value [, ... ] )

donde action es uno de:

    ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
    DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ]
    ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]

Descripción

ALTER TYPE cambia la definición de un tipo existente. Hay varias subformas:

OWNER

Esta forma cambia el propietario del tipo.

RENAME

Esta forma cambia el nombre del tipo.

SET SCHEMA

Esta forma mueve el tipo a otro esquema.

RENAME ATTRIBUTE

Esta forma solo se puede usar con tipos compuestos. Cambia el nombre de un atributo individual del tipo.

ADD ATTRIBUTE

Esta forma agrega un nuevo atributo a un tipo compuesto, usando la misma sintaxis que CREATE TYPE.

DROP ATTRIBUTE [ IF EXISTS ]

Esta forma elimina un atributo de un tipo compuesto. Si se especifica IF EXISTS y el atributo no existe, no se genera ningún error. En este caso se emite una advertencia (notice) en su lugar.

ALTER ATTRIBUTE ... SET DATA TYPE

Esta forma cambia el tipo de un atributo de un tipo compuesto.

ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]

Esta forma agrega un nuevo valor a un tipo enumerado (enum). El lugar del nuevo valor en el orden del enum se puede especificar como BEFORE (antes) o AFTER (después) de uno de los valores existentes. De lo contrario, el nuevo elemento se agrega al final de la lista de valores.

Si se especifica IF NOT EXISTS, no es un error si el tipo ya contiene el nuevo valor: se emite una advertencia (notice) pero no se realiza ninguna otra acción. De lo contrario, se producirá un error si el nuevo valor ya está presente.

RENAME VALUE

Esta forma renombre un valor de un tipo enumerado (enum). El lugar del valor en el orden del enum no se ve afectado. Se producirá un error si el valor especificado no está presente o si el nuevo nombre ya está presente.

SET ( property = value [, ... ] )

Esta forma solo es aplicable a tipos base. Permite ajustar un subconjunto de las propiedades del tipo base que se pueden establecer en CREATE TYPE. Específicamente, se pueden cambiar estas propiedades:

  • RECEIVE se puede establecer con el nombre de una función de entrada binaria, o NONE para eliminar la función de entrada binaria del tipo. El uso de esta opción requiere privilegios de superusuario.

  • SEND se puede establecer con el nombre de una función de salida binaria, o NONE para eliminar la función de salida binaria del tipo. El uso de esta opción requiere privilegios de superusuario.

  • TYPMOD_IN se puede establecer con el nombre de una función de entrada de modificador de tipo, o NONE para eliminar la función de entrada de modificador de tipo. El uso de esta opción requiere privilegios de superusuario.

  • TYPMOD_OUT se puede establecer con el nombre de una función de salida de modificador de tipo, o NONE para eliminar la función de salida de modificador de tipo. El uso de esta opción requiere privilegios de superusuario.

  • ANALYZE se puede establecer con el nombre de una función de recopilación de estadísticas específica del tipo, o NONE para eliminar la función de recopilación de estadísticas del tipo. El uso de esta opción requiere privilegios de superusuario.

  • SUBSCRIPT se puede establecer con el nombre de una función controladora de subíndices específica del tipo, o NONE para eliminar la función controladora de subíndices del tipo. El uso de esta opción requiere privilegios de superusuario.

  • STORAGE se puede establecer en plain, extended, external, o main (consulta Section 66.2 para obtener más información sobre lo que esto significa). Sin embargo, cambiar de plain a otra configuración requiere privilegios de superusuario (porque requiere que todas las funciones C del tipo estén preparadas para TOAST), y cambiar a plain desde otra configuración no está permitido en absoluto (dado que el tipo ya puede tener valores TOAST presentes en la base de datos). Ten en cuenta que cambiar esta opción no cambia por sí mismo ningún dato almacenado, simplemente establece la estrategia TOAST predeterminada que se usará para las columnas de tabla creadas en el futuro. Consulta ALTER TABLE para cambiar la estrategia TOAST de las columnas de tabla existentes.

Consulta CREATE TYPE para obtener más detalles sobre estas propiedades del tipo. Ten en cuenta que, cuando corresponda, un cambio en estas propiedades para un tipo base se propagará automáticamente a los dominios basados en ese tipo.

Las acciones ADD ATTRIBUTE, DROP ATTRIBUTE, y ALTER ATTRIBUTE se pueden combinar en una lista de múltiples modificaciones para aplicar en paralelo. Por ejemplo, es posible agregar varios atributos y/o cambiar el tipo de varios atributos en un solo comando.

Debes ser el propietario del tipo para usar ALTER TYPE. Para cambiar el esquema de un tipo, también debes tener el privilegio CREATE en el nuevo esquema. Para cambiar el propietario, debes ser capaz de hacer SET ROLE al nuevo rol propietario, y ese rol debe tener el privilegio CREATE en el esquema del tipo. (Estas restricciones garantizan que cambiar el propietario no permita hacer nada que no pudieras hacer eliminando y volviendo a crear el tipo. Sin embargo, un superusuario puede cambiar la propiedad de cualquier tipo de todos modos). Para agregar un atributo o cambiar el tipo de un atributo, también debes tener el privilegio USAGE en el tipo de datos del atributo.

Parámetros

name

El nombre (opcionalmente calificado por esquema) de un tipo existente que se va a modificar.

new_name

El nuevo nombre para el tipo.

new_owner

El nombre de usuario del nuevo propietario del tipo.

new_schema

El nuevo esquema para el tipo.

attribute_name

El nombre del atributo que se va a agregar, modificar o eliminar.

new_attribute_name

El nuevo nombre del atributo que se va a renombrar.

data_type

El tipo de datos del atributo a agregar, o el nuevo tipo del atributo a modificar.

new_enum_value

El nuevo valor a agregar a la lista de valores de un tipo enumerado (enum), o el nuevo nombre que se le dará a un valor existente. Como todos los literales enum, debe ir entre comillas.

neighbor_enum_value

El valor enumerado existente antes o después del cual se debe agregar inmediatamente el nuevo valor en el orden del tipo enum. Como todos los literales enum, debe ir entre comillas.

existing_enum_value

El valor enumerado existente que se debe renombrar. Como todos los literales enum, debe ir entre comillas.

property

El nombre de una propiedad del tipo base a modificar; consulta arriba los valores posibles.

CASCADE

Propagar automáticamente la operación a las tablas tipadas del tipo que se está modificando y sus descendientes.

RESTRICT

Rechazar la operación si el tipo que se está modificando es el tipo de una tabla tipada. Este es el comportamiento predeterminado.

Notas

Si ALTER TYPE ... ADD VALUE (la forma que agrega un nuevo valor a un tipo enum) se ejecuta dentro de un bloque de transacción, el nuevo valor no se puede usar hasta después de que la transacción se haya confirmado.

Las comparaciones que involucran un valor enum agregado a veces serán más lentas que las comparaciones que involucran solo a los miembros originales del tipo enum. Esto normalmente solo ocurrirá si se usa BEFORE o AFTER para establecer la posición de orden del nuevo valor en un lugar diferente al final de la lista. Sin embargo, a veces sucederá incluso si el nuevo valor se agrega al final (esto ocurre si el contador de OID dio la vuelta desde la creación original del tipo enum). La ralentización suele ser insignificante; pero si es importante, se puede recuperar el rendimiento óptimo eliminando y volviendo a crear el tipo enum, o respaldando y restaurando la base de datos.

Ejemplos

Para renombrar un tipo de datos:

ALTER TYPE electronic_mail RENAME TO email;

Para cambiar el propietario del tipo email a joe:

ALTER TYPE email OWNER TO joe;

Para cambiar el esquema del tipo email a customers:

ALTER TYPE email SET SCHEMA customers;

Para agregar un nuevo atributo a un tipo compuesto:

ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

Para agregar un nuevo valor a un tipo enum en una posición de orden particular:

ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';

Para renombrar un valor enum:

ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';

Para crear funciones de E/S binarias para un tipo base existente:

CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
    SEND = mytypesend,
    RECEIVE = mytyperecv
);

Compatibilidad

Las variantes para agregar y eliminar atributos forman parte del estándar SQL; las otras variantes son extensiones de PostgreSQL.

Véase también

CREATE TYPE, DROP TYPE