Stałe rozwiązanie dla tego przypadku
Aby całkowicie uniknąć problemu, użyj typu danych text
lub varchar
/ character varying
bez specyfikatora długości zamiast character varying(n)
. Przeczytaj o tych typach danych w instrukcji.
CREATE TABLE monkey(name text NOT NULL)
Jeśli naprawdę chcesz wymusić maksymalną długość, utwórz CHECK
ograniczenie :
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Możesz zmienić lub usunąć to ograniczenie w dowolnym momencie bez dotykania zależnych obiektów, takich jak widoki i bez zmuszania Postgresa do pisania nowych wierszy w tabeli ze względu na zmianę typu (co nie zawsze jest już konieczne w nowoczesnej wersji Postgresa).
Szczegółowe wyjaśnienie
Zgodnie z propozycją @Michael dodaję kilka bardziej ogólnych informacji:
Widok w PostgreSQL to nie tylko "alias do podzapytania". Widoki są zaimplementowane jako specjalne tabele z regułą ON SELECT TO my_view DO INSTEAD
. (Dlatego możesz zmieniać widoki za pomocą ALTER TABLE
polecenie.) Możesz GRANT
uprawnienia do niego, dodawać komentarze, a nawet definiować wartości domyślne kolumn (przydatne w przypadku reguły ON INSERT TO my_view DO INSTEAD...
). Przeczytaj więcej w instrukcji tutaj lub tutaj.
Jeśli zmienisz obiekty bazowe, musisz również zmienić zapytanie definiujące dowolnego zależnego widoku. ALTER VIEW
Instrukcja może zmienić tylko atrybuty pomocnicze widoku. Użyj CREATE OR REPLACE VIEW
aby zmienić zapytanie - zachowa wszelkie dodatkowe atrybuty.
Jeśli jednak chcesz zmienić typy danych w kolumnach wynikowych (jak w omawianym przypadku), CREATE OR REPLACE VIEW
nie jest możliwe. Musisz DROP
stary i CREATE
nowy widok. To nigdy nie usunie żadnych danych z tabel źródłowych. będzie upuść jednak wszelkie dodatkowe atrybuty widoku, które również muszą zostać odtworzone.