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

Modifier les colonnes PostgreSQL utilisées dans les vues

Solution permanente pour ce cas

Pour éviter complètement le problème, utilisez le type de données text ou varchar / character varying sans spécificateur de longueur au lieu de character varying(n) . En savoir plus sur ces types de données dans le manuel.

CREATE TABLE monkey(name text NOT NULL)

Si vous voulez vraiment imposer une longueur maximale, créez un CHECK contrainte :

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

Vous pouvez modifier ou supprimer cette contrainte à tout moment sans toucher aux objets dépendants comme les vues et sans forcer Postgres à écrire de nouvelles lignes dans la table en raison du changement de type (ce qui n'est plus toujours nécessaire dans la version moderne de Postgres).

Explication détaillée

Comme proposé par @Michael, j'ajoute quelques informations plus générales :

Une vue dans PostgreSQL n'est pas simplement un "alias vers une sous-requête". Les vues sont implémentées en tant que tables spéciales avec une règle ON SELECT TO my_view DO INSTEAD . (C'est pourquoi vous pouvez modifier les vues avec un ALTER TABLE commande.) Vous pouvez GRANT privilèges, ajouter des commentaires ou même définir les valeurs par défaut des colonnes (utile pour une règle ON INSERT TO my_view DO INSTEAD... ). En savoir plus dans le manuel ici ou ici.

Si vous modifiez les objets sous-jacents, vous devez également modifier la requête de définition de toute vue dépendante. Le ALTER VIEW L'instruction ne peut modifier que les attributs auxiliaires d'une vue. Utilisez CREATE OR REPLACE VIEW pour modifier la requête - cela conservera tous les attributs supplémentaires.

Cependant, si vous souhaitez modifier les types de données des colonnes résultantes (comme dans le cas présent), CREATE OR REPLACE VIEW n'est pas possible. Vous devez DROP l'ancien et CREATE une nouvelle vue. Cela ne supprimera jamais les données des tables sous-jacentes. Cela va supprimez tous les attributs supplémentaires de la vue, qui doivent également être recréés.