Solução permanente para este caso
Para evitar o problema, use o tipo de dados
text
ou varchar
/ character varying
sem um especificador de comprimento em vez de character varying(n)
. Leia sobre esses tipos de dados no manual. CREATE TABLE monkey(name text NOT NULL)
Se você realmente deseja impor um comprimento máximo, crie um
CHECK
restrição :ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Você pode alterar ou descartar essa restrição a qualquer momento sem tocar em objetos dependentes como visualizações e sem forçar o Postgres a escrever novas linhas na tabela devido à mudança de tipo (o que nem sempre é mais necessário na versão moderna do Postgres).
Explicação detalhada
Conforme proposto por @Michael, adiciono algumas informações mais gerais:
Uma visão no PostgreSQL não é apenas um "alias para subconsulta". As visualizações são implementadas como tabelas especiais com uma regra
ON SELECT TO my_view DO INSTEAD
. (É por isso que você pode alterar as visualizações com um ALTER TABLE
comando.) Você pode GRANT
privilégios a ele, adicionar comentários ou mesmo definir padrões de coluna (útil para uma regra ON INSERT TO my_view DO INSTEAD...
). Leia mais no manual aqui ou aqui. Se você alterar os objetos subjacentes, também precisará alterar a consulta de definição de qualquer exibição dependente. A
ALTER VIEW
A instrução só pode alterar os atributos auxiliares de uma visão. Use CREATE OR REPLACE VIEW
para alterar a consulta - ela preservará quaisquer atributos adicionais. No entanto, se você quiser alterar os tipos de dados das colunas resultantes (como no caso em questão),
CREATE OR REPLACE VIEW
não é possível. Você tem que DROP
o antigo e CREATE
uma nova visão. Isso nunca excluirá nenhum dado das tabelas subjacentes. Ele vai no entanto, descarte quaisquer atributos adicionais da visualização, que também precisam ser recriados.