Solución permanente para este caso
Para evitar el problema por completo, use el tipo de datos text
o varchar
/ character varying
sin un especificador de longitud en lugar de character varying(n)
. Lea acerca de estos tipos de datos en el manual.
CREATE TABLE monkey(name text NOT NULL)
Si realmente desea imponer una longitud máxima, cree un CHECK
restricción :
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Puede cambiar o eliminar esa restricción en cualquier momento sin tocar objetos dependientes como vistas y sin obligar a Postgres a escribir nuevas filas en la tabla debido al cambio de tipo (que ya no siempre es necesario en la versión moderna de Postgres).
Explicación detallada
Según lo propuesto por @Michael, agrego más información general:
Una vista en PostgreSQL no es solo un "alias para la subconsulta". Las vistas se implementan como tablas especiales con una regla ON SELECT TO my_view DO INSTEAD
. (Es por eso que puede alterar las vistas con un ALTER TABLE
comando). Puede GRANT
privilegios, agregar comentarios o incluso definir valores predeterminados de columna (útil para una regla ON INSERT TO my_view DO INSTEAD...
). Lea más en el manual aquí o aquí.
Si cambia los objetos subyacentes, también debe cambiar la consulta de definición de cualquier vista dependiente. El ALTER VIEW
La declaración solo puede cambiar los atributos auxiliares de una vista. Use CREATE OR REPLACE VIEW
para cambiar la consulta; conservará cualquier atributo adicional.
Sin embargo, si desea cambiar los tipos de datos de las columnas resultantes (como en el caso que nos ocupa), CREATE OR REPLACE VIEW
no es posible. Tienes que DROP
el viejo y CREATE
una nueva vista Esto nunca eliminará ningún dato de las tablas subyacentes. será sin embargo, elimine cualquier atributo adicional de la vista, que también debe volver a crearse.