ALTER TABLE

Anuncio
WikiPrint - from Polar Technologies
Tutorial PostgreSQL...
Referencia: Comandos SQL:
•
ALTER TABLE: cambiar la definición de una tabla
•
ANALYZE: colecta estadísticas sobre una bb.dd.
•
CREATE INDEX: define un nuevo índice
•
CREATE TABLE: define una nueva tabla
•
DELETE: elimina filas de una tabla
•
DROP TABLE: elimina una tabla
•
EXPLAIN: muestra el plan de ejecución
•
INSERT: crea nuevas filas en una tabla
•
SELECT: obtiene filas de una tabla o vista
•
TRUNCATE: vacía una tabla o un conjunto de ellas
•
UPDATE: modifica filas de una tabla
•
VACUUM: limpia y opcionalmente analiza una bb.dd.
Tipos de datos...
Funciones y Operadores...
ALTER TABLE
Nombre
ALTER TABLE -- cambiar la definición de una tabla
Sinopsis
ALTER TABLE [ ONLY ] nombre [ * ]
acción [, ... ]
ALTER TABLE [ ONLY ] nombre [ * ]
RENAME [ COLUMN ] columna TO nueva_columna
ALTER TABLE nombre
RENAME TO nuevo_nombre
ALTER TABLE nombre
SET SCHEMA nuevo_esquema
donde acción es uno de:
ADD [ COLUMN ] columna tipo [ restricción_columna [ ...
DROP [ COLUMN ] columna [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] columna [ SET DATA ] TYPE tipo [ USING
ALTER [ COLUMN ] columna SET DEFAULT expresión
ALTER [ COLUMN ] columna DROP DEFAULT
ALTER [ COLUMN ] columna { SET | DROP } NOT NULL
ALTER [ COLUMN ] columna SET STATISTICS integer
ALTER [ COLUMN ] columna SET STORAGE { PLAIN | EXTERNAL
ADD restricción_tabla
DROP CONSTRAINT nombre_restricción [ RESTRICT | CASCADE
DISABLE TRIGGER [ nombre_disparador | ALL | USER ]
ENABLE TRIGGER [ nombre_disparador | ALL | USER ]
ENABLE REPLICA TRIGGER nombre_disparador
ENABLE ALWAYS TRIGGER nombre_disparador
DISABLE RULE nombre_regla_reescritura
ENABLE RULE nombre_regla_reescritura
1
] ]
expresión ]
| EXTENDED | MAIN }
]
WikiPrint - from Polar Technologies
ENABLE REPLICA RULE nombre_regla_reescritura
ENABLE ALWAYS RULE nombre_regla_reescritura
CLUSTER ON nombre_indice
SET WITHOUT CLUSTER
SET WITH OIDS
SET WITHOUT OIDS
SET ( parámetro_almacenamiento = valor [, ... ] )
RESET ( parámetro_almacenamiento [, ... ] )
INHERIT tabla_padre
NO INHERIT tabla_padre
OWNER TO nuevo_propietario
SET TABLESPACE nuevo_espacio_tabla
Descripción
ALTER TABLE cambia la definición de una tabla existente. Hay varias sub-formas:
ADD COLUMN
Esta forma agrega una nueva columna a la tabla, usando la misma sintaxis que CREATE TABLE.
DROP COLUMN
Esta forma elimina una columna de una tabla. Los índices y restricciones involucrando la columna serán también automáticamente eliminados. Será
necesario escribir CASCADE si algo fuera de la tabla depende de la columna, por ejemplo, una referencia de llave foránea o vista.
SET DATA TYPE
Esta forma cambia el tipo de una columna de una tabla. Los índices y restricciones simples involucrando la columna serán automáticamente
convertidas para usar el nuevo tipo al reanalizar las expresiones provistas originalmente. La clausula opcional USING especifica como computar el
nuevo valor de la columna a partir del viejo; si es omitida, la conversión por defecto es la misma que una asignación usando cast del viejo tipo de
datos al nuevo. Una clausula USING debe proveerse si no hay una conversión implícita del tipo viejo al nuevo.
SET/DROP DEFAULT
Estas forma establece o elimina un valor predeterminado para una columna. El valor predeterminado solo aplica a comandos
INSERT subsecuentes; no causan cambios en las filas actualmente en la tabla. Valores predeterminados pueden ser creados también para las
vistas, en cuyo caso son insertados a las sentencias INSERT de la vista antes de que se aplique la regla ON INSERT.
SET/DROP NOT NULL
Estas formas cambian en que caso la columna permite o rechaza valores nulos. Solo se puede usar SET NOT NULL cuando la columna no
contiene valores nulos.
SET STATISTICS
Esta forma establece el objetivo de recolección de estadísticas por columna para las subsecuentes operaciones ANALYZE. El objetivo puede ser
establecido en el rango de 0 a 10000; alternativamente, establecer a -1 para revertir y usar el valor predeterminado del sistema
( default_statistics_target). Para más información en el uso de estadísticas por el planeador de consultas de PostgreSQL, referirse a Sección 14.2.
SET STORAGE
Esta forma establece el modo de almacenamiento para una columna. Controla cuando la columna es mantenida en línea o en una tabla
suplementaria, y cuando los datos deben ser comprimidos o no. PLAIN debe usarse para valores de longitud fija como integer y es almacenado
en línea, sin comprimir. MAIN es para datos en linea, comprimibles. EXTERNAL es para datos externos, sin comprimir y EXTENDED es para datos
externos, comprimidos. EXTENDED es lo predeterminado para la mayoria de los tipos de datos que soportan almacenamiento no-PLAIN. Usar
EXTERNAL hará más rápidas las operaciones de subcadena sobre text y bytea, con la penalidad de un espacio de almacenamiento
incrementado. Notar que SET STORAGE en si mismo no cambia nada en la tabla, solo establece la estrategia a seguir durante las futuras
actualizaciones de la tabla. Ver Sección 53.2 para más información.
ADD restricción_tabla
Esta forma agrega una nueva restricción a la tabla usando la misma sintaxis de CREATE TABLE.
DROP CONSTRAINT
Esta forma baja una restricción específica de una tabla.
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER
Estas formas configuran el disparo de un disparador perteneciente a la tabla. Un disparador deshabilitado es aún reconocido por el sistema, pero no
es ejecutado cuando el evento de disparo ocurre. Para un disparador diferido, el estado de habilitación es comprobado cuando el evento ocurre, no
cuando la función del disparador es realmente ejecutada. Se puede deshabilitar o habilitar un disparador individual especificado por su nombre, o
todos los disparadores de la tabla, o solo los disparadores del usuario (exto excluye disparadores que son usados para implementar las
restricciones de claves foráneas). Deshabilitar o habilitar un disparador de restricción requiere tener privilegios de superusuario; debe ser hecho con
cuidado a que no puede garantizarse la integridad de la restricción si el disparador no es ejecutado. El mecanismo de disparo también es afectado
por la variable de configuración session_replication_role. Disparadores habilitados de forma simple dispararán cuando el rol de replicación
2
WikiPrint - from Polar Technologies
es "origin" (lo predeterminado) o "local". Disparadores configurados como ENABLE REPLICA solo se dispararán si la sesión esta en modo "replica",
y los disparadores configurados como ENABLE ALWAYS dispararán siempre sin importar el modo actual de replicación.
DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE
Estas formas configuran el disparo de las reglas de reescritura pertenecientes a la tabla. Una regla deshabilitada es reconocida por el sistema, pero
no es aplicada durante la reescritura de la consulta. Las semánticas son similares a las de habilitación/deshabilitación de disparadores. Esta
configuración es ingnorada para reglas ON SELECT, las cuales siempres son aplicadas en orden para mantener las vistas funcionando aún si la
sesión actual esta en un rol no predeterminado de replicación.
CLUSTER
Esta forma selecciona el indice por defecto para futuras operaciones CLUSTER. Esto no reorganiza la tabla en realidad.
SET WITHOUT CLUSTER
Esta forma elimina de la tabla la especificación más reciente de índice CLUSTER usada. Esto afecta operaciones futuras de cluster que no
especifican un índice.
SET WITH OIDS
Esta forma agrega una columna del sistema oid a la tabla (ver Section 5.4). No hace nada si la tabla actualmente tiene OIDs.
Note que no es equivalente a ADD COLUMN oid oid; eso agregaría una columna normal con nombre oid, no una columna del sistema.
SET WITHOUT OIDS
Esta forma elimina la columna de sistema oid. Es exactamente equivalente a DROP COLUMN oid RESTRICT, exceptuando que no se negará si
no hay actualmente una columna oid.
SET ( parámetro_almacenamiento = valor [, ... ] )
Esta forma cambia uno o más parámetros de almacenamiento de la tabla. Ver Parámetros de Almacenamiento para detalles de los parámetros
disponibles. Note que los contenidos de la tabla no serán modificados inmediatamente por este comando; dependiendo del parámetro necesitaría
reescribir la tabla para obtener el efecto deseado. Puede ser hecho con CLUSTER o una de las formas de ALTER TABLE que fuerzan la
reescritura de la tabla.
Nota: Mientras CREATE TABLE permite que los OIDS sean especificados con la sintaxis WITH (parámetro_almacenamiento), ALTER
TABLE no trata a OIDS como parámetro de almacenamiento. En su caso usar las formas SET WITH OIDS y SET WITHOUT OIDS para cambiar
el estado de los OIDs.
RESET ( parámetro_almacenamiento [, ... ] )
Esta forma restablece uno o mas parámetros de almacenamiento a sus valores predeterminados. Como con SET, una reescritura de tabla podría
ser necesaria para actualizar la tabla entera.
INHERIT tabla_padre
Esta forma agrega una tabla destino como nueva hija de la tabla padre especificada. Sucesivamente, las consultas contra la tabla padre incluirán
registros de la tabla destino. Para ser agregado como hijo, la tabla destino debe contener actualmente todas las mismas columnas que el padre
(también podría tener columnas adicionales). Las columnas deben tener tipos de datos coincidentes, y si tienen restricciones NOT NULL en el padre
deben tener restricciones NOT NULL en el hijo al mismo tiempo.
Debe haber también restricciones en la tabla hijo que coincidan para todas las restricciones CHECK del padre. Actualmente las restricciones
UNIQUE, PRIMARY KEY, y FOREIGN KEY no son consideradas, pero esto puede cambiar en el futuro.
NO INHERIT tabla_padre
Esta forma elimina la tabla destino de la lista de las hijas de la tabla padre especificada. Las consultas contra el padre no incluirán más registros
obtenidos de la tabla destino.
OWNER
Esta forma cambia el propietario de la tabla, secuencia o vista, al usuario especificado.
SET TABLESPACE
Esta forma cambia el espacio de tabla y mueve los archivos de datos asociados con la tabla al nuevo espacio. Los índices de la tabla, si hay, no
son movidos; pero pueden ser movidos individualmente con los comandos SET TABLESPACE. Ver tambien CREATE TABLESPACE.
RENAME
La forma RENAME cambia el nombre de la tabla (o de un índice, secuencia, o vista) o el nombre de una columna individual de la tabla. No hay
efectos sobre los datos almacenados.
SET SCHEMA
Esta forma mueve la tabla en otro esquema. Los índices asociados, restricciones y secuencias propios de la tabla serán movidos también.
Todas estas acciones exceptuando RENAME y SET SCHEMA pueden ser combinadas en una lista de múltiples alteraciones a a aplicar en paralelo. Por
ejemplo, es posible agregar varias columnas y/o alterar el tipo de varias columnas en un mismo comando. Esto es particularmente útil para tablas
grandes, dado que solo se necesita hacer una pasada sobre la tabla.
3
WikiPrint - from Polar Technologies
Debe ser propietario de la tabla para usar ALTER TABLE. Para cambiar el esquema de una tabla, debe tener también privilegios CREATE en el nuevo
esquema. Para agregar la tabla como nuevo hijo de la tabla padre, debe ser propietario de la tabla padre. Para alterar el propietario, debe ser miembro
directo o indirecto del nuevo rol propietario y debe tener privilegios CREATE en el esquema de la tabla. (Estas restriciones aseguran que al alterar el
propietario no se pueda realizar nada que no se pueda hacer bajando y recreeando la tabla. Aún así, un superusuario puede alterar la propiedad de una
tabla de cualquier manera.)
Parámetros
nombre
El nombre de una tabla existente para alterar (posiblemente calificado por esquema). Si se especifica ONLY, solo la tabla es afectada. Si ONLY no
se especifica, la tabla y cualquier descendiente es alterada.
columna
Nombre de la columna existente o nueva.
nueva_columna
Nuevo nombre para una columna existente.
nuevo_nombre
Nuevo nombre para la tabla.
tipo
Tipo de datos para la nueva columna, o nuevo tipo de datos para una columna existente.
restricción_tabla
Nueva restricción de tabla.
nombre_restricción
Nombre de una restricción existente para bajar.
CASCADE
Automáticamente baja objetos que dependen de la columna o restricción bajada (por ejemplo, vistas que referencian la columna).
RESTRICT
Rechaza bajar la columna o la restricción si hay algún objeto dependiente. Este es el comportamiento por defecto.
nombre_disparador
Nombre de un disparador individual para deshabilitar o habilitar.
ALL
Deshabilita o habilita todos los disparadores pertenecientes a la tabla. (Requiere privilegio de superusuario si alguno de los disparadores es para
restricciones de clave foranea.)
USER
Deshabilita o habilita todos los disparadores pertenecientes a la tabla excepto los de restricciones de clave foránea.
nombre_índice
El nombre del índice en el cual la tabla debe ser marcada para clustering.
parámetro_almacenamiento
El nombre un parámetro de almacenamiento de la tabla.
valor
El nuevo valor para un parámetro de almacenamiento. Esto debería ser un número o palabra dependiendo del parámetro.
tabla_padre
Una tabla padre a asociar o desasociar con esta tabla.
nuevo_propietario
El nombre de usuario del nuevo dueño de la tabla.
nuevo_espacio_tabla
El nombre del espacio de tabla al cual será movida la tabla.
nuevo_esquema
El nombre del esquema al cual será movida la tabla.
Notas
La palabra clave COLUMN es redundante y puede ser omitida.
Cuando una columna es agregada con ADD COLUMN, todas las filas existentes en la tabla son inicializadas con el valor predeterminado de la columna
(NULL en caso de que no se especificó DEFAULT).
4
WikiPrint - from Polar Technologies
Agregando una columna con un valor predeterminado no nulo o cambiando el tipo de una columna existente requerirá que la tabla entera sea reescrita.
Esto podría tardar una cantidad considerable de tiempo para una tabla grande; y temporariamente requerirá el doble del espacio de disco. Agragando o
eliminado una columna del sistema oid igualmente requiere reescribir la tabla entera.
Agregando una restricción CHECK o NOT NULL requiere escudriñar la tabla para verificar la existencia de filas que cumplan con la condición.
La razón principal para proveer la opción de especificar múltiples cambios en una ALTER TABLE individual es que los escudriñamientos o reescrituras
múltiples pueden de este modo ser combinados en una sola pasada sobre la tabla.
La forma DROP COLUMN no elimina físicamente la columna, simplemente la hace invisible a las operaciones SQL. Operaciones de inserciones y
modificaciones subsecuentes almacenarán un valor nulo para la columna. Por lo tanto, bajando una columna es rápido pero no reducirá inmediatamente
el espacio en disco de la tabla, ya que el espacio ocupado por la columna dada de baja no es reclamado. El espacio será reclamado en el tiempo
cuando las filas existentes sean modificadas. (Estas oraciones no aplican cuando se baja una columna del sistema oid; lo que es hecho con una
reescritura inmediata.)
El hecho que ALTER TYPE requiere reescribir la tabla completa es en ocaciones una ventaja, dado que el proceso de reescritura elimina cualquier
espacio muerto en la tabla. Por ejemplo, para reclamar el espacio ocupado por una columna dada de baja inmediatamente, el modo más rápido es:
ALTER TABLE talba ALTER COLUMN cualquier_columna TYPE cualquier_tipo;
donde cualquier_columna es cualquier columna de la tabla y cualquier_tipo es el mismo tipo de columna que actualmente tiene. Esto resulta en
que no se cambia la semántica visible de la tabla, pero el comando fuerza una reescritura, lo que se encarga de los datos inútiles.
La opción USING de ALTER TYPE puede especificar cualquier expresión involucrando los valores viejos de las filas; esto es, puede referirse a otras
columnas en adición a la que esta siendo convertida. Esto permite hacer conversiones muy generales con la sintaxis ALTER TYPE. Dada esta
flexibilidad, la expresión USING no es aplicada al valor predeterminado de la columna (si es que hay); el resultado puede no ser una expresión constante
como se requiere para un valor predeterminado. Esto significa que cuando no hay una conversión implícita del viejo tipo al nuevo, ALTER TYPE podría
fallar en convertir el valor predeterminado aunque se provea una clausula USING. En dicho caso, bajar el valor predeterminado con DROP DEFAULT,
realizar el ALTER TYPE, y luego usar SET DEFAULT para agregar un nuevo predeterminado conveniente. Consideraciones similares aplican a los
índices y restricciones involucrando la columna.
Si la tabla tiene algún descendiente, no se permite agregar, renombrar o cambiar el tipo de una columna en la tabla padre sin hacer lo mismo en los
descendientes. Esto es,ALTER TABLE ONLY será rechazado. Esto asegura que los descendientes siempre tengan las columnas que coincidan con el
padre.
Una operación recursiva DROP COLUMN eliminará las columnas solo si los descendientes no heredan dicha columna de algún padre y nunca tuvieron
una definición independiente de dicha columna. Un DROP COLUMN no recursivo (por ej., ALTER TABLE ONLY ... DROP COLUMN) nunca elimina
ninguna columna descendiente, en su lugar las marca como definidas independientemente en vez que heredadas.
Las acciones TRIGGER, CLUSTER, OWNER, y TABLESPACE nunca se aplican en tablas descendientes; esto es, siempre actúan como si se
especificara ONLY. Agregar una restricción puede aplicarse en tablas descendientes solo para restricciones CHECK, y es requerido que así lo haga para
dichas restricciones.
Cambiando cualquier parte de la tabla del catalogo del sistema no esta permitido.
Referise a CREATE TABLE para mayor descripción del los parámetros válidos. Capítulo 5 tiene mayor descripción sobre la herencia.
Ejemplos
Para agregar una columna del tipo varchar a la tabla:
ALTER TABLE distribuidores ADD COLUMN domicilio varchar(30);
Para bajar una columna de una tabla:
ALTER TABLE distribuidores DROP COLUMN domicilio RESTRICT;
Para cambiar los tipos de dos columna existentes en una sola operación:
ALTER TABLE distribuidores
ALTER COLUMN domicilio TYPE varchar(80),
5
WikiPrint - from Polar Technologies
ALTER COLUMN nombre TYPE varchar(100);
Para cambiar una columna entera conteniendo marcas de tiempo UNIX a timestamp with time zone vía clausula 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 predeterminada que no se convertirá automáticamente al nuevo tipo:
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 distribuidores RENAME COLUMN domicilio TO ciudad;
Para renombrar una tabla existente:
ALTER TABLE distribuidores RENAME TO domicilio;
Para agregar una restricción no nula a una columna:
ALTER TABLE distribuidores ALTER COLUMN calle SET NOT NULL;
Para eliminar una restricción no nula de una columna:
ALTER TABLE distribuidores ALTER COLUMN calle DROP NOT NULL;
Para agregar una restricción de chequeo a una tabla y a todas sus hijas:
ALTER TABLE distribuidores ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
Para eliminar una restricción de chequeo de una tabla y de todas sus hijas:
ALTER TABLE distribuidores DROP CONSTRAINT zipchk;
Para remover una restricción de chequeo de una sola tabla:
ALTER TABLE ONLY distribuidores DROP CONSTRAINT zipchk;
(La restricción de chequeo se mantiene para las tablas hijas.)
Para agregar una restricción de clave foránea a una tabla:
ALTER TABLE distribuidores ADD CONSTRAINT distfk FOREIGN KEY (domicilio) REFERENCES domicilios (domicilio) MATCH FULL;
Para agregar una restricción única multicolumna a una tabla:
ALTER TABLE distribuidores
ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
Para agergar una restricción de clave primaria nombrada automáticamente, notando que una tabla debe tener siempre una llave primaria:
6
WikiPrint - from Polar Technologies
ALTER TABLE distribuidores
ADD PRIMARY KEY (dist_id);
Para mudar una tabla a un espacio de nombres diferente:
ALTER TABLE distribuidores SET TABLESPACE espacio_tabla_rapido;
Para mudar la tabla a un esquema diferente:
ALTER TABLE mi_esquema.distribuidores SET SCHEMA tu_esquema;
Compatibilidad
Las formas ADD, DROP, SET DEFAULT, y SET DATA TYPE (sin USING) se ajustan al estándar SQL. Las otras formas son extensiones PostgreSQL al
estándar. También, la habilidad de especificar más de una manipulación en un comando individual ALTER TABLE es una extensión.
ALTER TABLE DROP COLUMN puede ser usada para bajar la única columna de una tabla, dejando una tabla sin columnas. Esto es una extensión al
estándar SQL, el que no permite tablas con cero columnas.
7
Descargar