Permanente oplossing voor dit geval
Gebruik het gegevenstype text
om het probleem helemaal te vermijden of varchar
/ character varying
zonder lengtespecificatie in plaats van character varying(n)
. Lees over deze datatypes in de handleiding.
CREATE TABLE monkey(name text NOT NULL)
Als je echt een maximale lengte wilt afdwingen, maak dan een CHECK
. aan beperking :
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Je kunt die beperking op elk moment wijzigen of laten vallen zonder afhankelijke objecten zoals views aan te raken en zonder Postgres te dwingen nieuwe rijen in de tabel te schrijven vanwege de verandering van type (wat niet altijd meer nodig is in de moderne versie van Postgres).
Gedetailleerde uitleg
Zoals voorgesteld door @Michael, voeg ik wat meer algemene informatie toe:
Een view in PostgreSQL is niet zomaar een "alias naar subquery". Weergaven worden geïmplementeerd als speciale tabellen met een regel ON SELECT TO my_view DO INSTEAD
. (Daarom kun je weergaven wijzigen met een ALTER TABLE
commando.) U kunt GRANT
privileges eraan toe, voeg opmerkingen toe of definieer zelfs kolomstandaarden (handig voor een regel ON INSERT TO my_view DO INSTEAD...
). Lees hier of hier meer in de handleiding.
Als u onderliggende objecten wijzigt, moet u ook de definiërende query van een afhankelijke weergave wijzigen. De ALTER VIEW
statement kan alleen hulpattributen van een view wijzigen. Gebruik CREATE OR REPLACE VIEW
om de zoekopdracht te wijzigen - het behoudt alle extra attributen.
Als u echter de gegevenstypen van de resulterende kolommen wilt wijzigen (zoals in het onderhavige geval), CREATE OR REPLACE VIEW
is niet mogelijk. Je moet DROP
de oude en CREATE
een nieuwe kijk. Hiermee worden nooit gegevens van de onderliggende tabellen verwijderd. Het zal laat echter eventuele aanvullende kenmerken van de weergave vallen, die ook opnieuw moeten worden gemaakt.