sql >> Base de Datos >  >> RDS >> PostgreSQL

Cambiar el nombre de las tablas de forma segura utilizando columnas de clave principal en serie

serial no es un tipo de datos real. El manual dice:

Los tipos de datos smallserial , serial y bigserial no son tipos verdaderos, sino simplemente una conveniencia notacional para crear columnas de identificadores únicos

El tipo de pseudodato se resuelve haciendo todo esto:

  • crea una secuencia llamada tablename_colname_seq

  • crea la columna con el tipo integer (o int2 / int8 respectivamente para smallserial / bigserial )

  • hacer que la columna NOT NULL DEFAULT nextval('tablename_colname_seq')

  • hacer que la columna sea dueña de la secuencia, para que se suelte automáticamente

El sistema no sepa si hizo todo esto a mano o mediante el pseudo tipo de datos serial . pgAdmin verifica las funciones enumeradas y, si se cumplen todas, el script DDL de ingeniería inversa se simplifica con el serial coincidente tipo. Si una de las características no se cumple, esta simplificación no se produce. Eso es algo que hace pgAdmin. Para las tablas de catálogo subyacentes es todo lo mismo. No hay serial escriba como tal.

No hay forma de cambiar automáticamente el nombre de las secuencias propias. Puede ejecutar:

ALTER SEQUENCE ... RENAME TO ...

como tu lo hiciste Al sistema en sí no le importa el nombre . La columna DEFAULT almacena un OID ('foo_pkey_seq'::regclass ), puede cambiar el nombre de la secuencia sin romper eso:el OID permanece igual. Lo mismo ocurre con las claves foráneas y referencias similares dentro de la base de datos.

El índice implícito de la clave principal está vinculado al nombre de la restricción PK, que no cambiar si cambia el nombre de la tabla. En Postgres 9.2 o posterior puede usar

ALTER TABLE ... RENAME CONSTRAINT ..

para rectificar eso también.

También puede haber índices nombrados en referencia al nombre de la tabla. Procedimiento similar:

ALTER INDEX .. RENAME TO  ..

Puede tener todo tipo de referencias informales al nombre de la tabla. El sistema no puede forzar el cambio de nombre de los objetos que pueden tener el nombre que desee. Y no le importa.

Por supuesto, no desea invalidar el código SQL que hace referencia a esos nombres. Obviamente, no desea cambiar los nombres mientras la lógica de la aplicación hace referencia a ellos. Normalmente, esto no sería un problema para los nombres de índices, secuencias o restricciones, ya que normalmente no se hace referencia a ellos por su nombre.

Postgres también adquiere un bloqueo en los objetos antes de cambiarles el nombre. Entonces, si hay transacciones simultáneas abiertos que tienen algún tipo de bloqueo en los objetos en cuestión, su RENAME la operación se detiene hasta que esas transacciones se confirman o revierten.

Catálogos del sistema y OIDs

El esquema de la base de datos se almacena en tablas del catálogo del sistema en el esquema del sistema pg_catalog . Todos los detalles en el manual aquí. Si no sabe exactamente lo que está haciendo, no debería jugar con esas tablas en absoluto . Un movimiento en falso y puedes romper tu base de datos. Use los comandos DDL que proporciona Postgres.

Para algunas de las tablas más importantes, Postgres proporciona tipos de identificadores de objetos y conversión de tipos para obtener rápidamente el nombre del OID y viceversa. Me gusta:

SELECT 'foo_pkey_seq'::regclass

Si el nombre del esquema está en search_path y el nombre de la tabla es único, eso te da lo mismo que:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

La clave principal de la mayoría de las tablas de catálogo es oid e internamente, la mayoría de las referencias usan OID.