Permanent lösning för det här fallet
För att undvika problemet helt och hållet använd datatypen text
eller varchar
/ character varying
utan en längdspecifikator istället för character varying(n)
. Läs om dessa datatyper i manualen.
CREATE TABLE monkey(name text NOT NULL)
Om du verkligen vill genomdriva en maximal längd, skapa en CHECK
begränsning :
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Du kan ändra eller släppa den begränsningen när som helst utan att röra beroende objekt som vyer och utan att tvinga Postgres att skriva nya rader i tabellen på grund av ändringen av typ (vilket inte alltid är nödvändigt längre i modern version av Postgres).
Detaljerad förklaring
Som föreslagits av @Michael lägger jag till lite mer allmän information:
En vy i PostgreSQL är inte bara ett "alias till subquery". Vyer implementeras som specialtabeller med en regel ON SELECT TO my_view DO INSTEAD
. (Det är därför du kan ändra vyer med en ALTER TABLE
kommando.) Du kan GRANT
privilegier till det, lägg till kommentarer eller till och med definiera kolumnstandardvärden (användbart för en regel ON INSERT TO my_view DO INSTEAD...
). Läs mer i manualen här eller här.
Om du ändrar underliggande objekt måste du också ändra den definierande frågan för en beroende vy. ALTER VIEW
uttalande kan bara ändra extra attribut för en vy. Använd CREATE OR REPLACE VIEW
för att ändra frågan - det kommer att bevara eventuella ytterligare attribut.
Men om du vill ändra datatyper för resulterande kolumner (som i det aktuella fallet), CREATE OR REPLACE VIEW
är inte möjligt. Du måste DROP
den gamla och CREATE
en ny syn. Detta kommer aldrig att radera någon data från de underliggande tabellerna. Det kommer släpp dock alla ytterligare attribut i vyn, som också måste återskapas.