PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renommer les tables en toute sécurité à l'aide de colonnes de clé primaire série

serial n'est pas un type de données réel. Le manuel indique :

Les types de données smallserial , serial et bigserial ne sont pas de vrais types, mais simplement une commodité de notation pour créer des colonnes d'identifiant unique

Le type de pseudo-données est résolu en faisant tout cela :

  • créer une séquence nommée tablename_colname_seq

  • créer la colonne de type integer (ou int2 / int8 respectivement pour smallserial / bigserial )

  • rendre la colonne NOT NULL DEFAULT nextval('tablename_colname_seq')

  • rendre la colonne propriétaire de la séquence, de sorte qu'elle soit supprimée automatiquement avec elle

Le système ne le fait pas savoir si vous avez fait tout cela à la main ou au moyen du pseudo type de données serial . pgAdmin vérifie les fonctionnalités répertoriées et si toutes sont remplies, le script DDL rétro-conçu est simplifié avec le serial correspondant taper. Si l'une des caractéristiques n'est pas remplie, cette simplification n'a pas lieu. C'est quelque chose que fait pgAdmin. Pour les tables de catalogue sous-jacentes, c'est la même chose. Il n'y a pas de serial tapez comme tel.

Il n'y a aucun moyen de renommer automatiquement les séquences possédées. Vous pouvez exécuter :

ALTER SEQUENCE ... RENAME TO ...

comme tu l'as fait. Le système lui-même ne se soucie pas du nom . La colonne DEFAULT stocke un OID ('foo_pkey_seq'::regclass ), vous pouvez changer le nom de la séquence sans le casser - l'OID reste le même. Il en va de même pour les clés étrangères et les références similaires à l'intérieur de la base de données.

L'index implicite de la clé primaire est lié au nom de la contrainte PK, qui ne sera pas changer si vous changez le nom de la table. Dans Postgres 9.2 ou version ultérieure, vous pouvez utiliser

ALTER TABLE ... RENAME CONSTRAINT ..

pour rectifier cela aussi.

Il peut également y avoir des index nommés en référence au nom de la table. Procédure similaire :

ALTER INDEX .. RENAME TO  ..

Vous pouvez avoir toutes sortes de références informelles au nom de la table. Le système ne peut pas renommer de force des objets qui peuvent être nommés comme vous le souhaitez. Et il s'en fiche.

Bien sûr, vous ne voulez pas invalider le code SQL qui fait référence à ces noms. Évidemment, vous ne voulez pas changer les noms alors que la logique de l'application les référence. Normalement, cela ne poserait pas de problème pour les noms d'index, de séquences ou de contraintes, car ceux-ci ne sont normalement pas référencés par leur nom.

Postgres acquiert également un verrou sur les objets avant de les renommer. Donc, s'il y a transaction simultanée open qui ont n'importe quel type de verrou sur les objets en question, votre RENAME l'opération est bloquée jusqu'à ce que ces transactions soient validées ou annulées.

Catalogues système et OID

Le schéma de la base de données est stocké dans les tables du catalogue système dans le schéma système pg_catalog . Tous les détails dans le manuel ici. Si vous ne savez pas exactement ce que vous faites, vous ne devriez pas jouer du tout avec ces tables . Un faux mouvement et vous pouvez casser votre base de données. Utilisez les commandes DDL fournies par Postgres.

Pour certaines des tables les plus importantes, Postgres fournit des types d'identifiant d'objet et des conversions de type pour obtenir rapidement le nom de l'OID et vice versa. Comme :

SELECT 'foo_pkey_seq'::regclass

Si le nom du schéma est dans le search_path et le nom de la table est unique, cela vous donne la même chose que :

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

La clé primaire de la plupart des tables de catalogue est oid et en interne, la plupart des références utilisent des OID.