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