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.